Delphi не показывает подсказки объекта/компонента, когда я кодирую

Если я не ошибаюсь, в delphi есть возможность показать список опций после того, как вы вставите имя компонента, за которым следует "." (точка) перед другими аргументами.

Мой delphi 7 не показывает этот список после "."

Пример: Когда я вхожу

form1.edit1.

Он должен показать список опций для компонента «TEdit». Не происходит, что не так?

Код:

unit Banri;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Clipbrd;

type
  TForm1 = class(TForm)
    EditTexto: TEdit;
    ButtonGO: TButton;
    procedure ButtonGOClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SL: TStringList;
  Count: Integer;
  Appwin : hWnd;

implementation

{$R *.dfm}

  var
  TextoCompleto: String;



begin
  TextoCompleto:= EditTexto.Text;
  Appwin:= FindWindow(PChar(0),'Banrisul');
  if Appwin <> 0 then
  begin
      StringReplace(TextoCompleto, '.', '', [rfReplaceAll, rfIgnoreCase]);

      SL:= TStringList.Create;
      try
        ExtractStrings([' '], [], PChar(TextoCompleto), SL);
        WriteLn(SL.Text);
        ReadLn;
      finally
        SL.Free;
  end;
      Count:= 0;
      while Count <> SL.Count - 1 do
        begin
          Clipboard.AsText:= SL[Count];; //place text in clipboard
          //if Clipboard.HasFormat(CF_TEXT) then
          //do something with text
          ShowMessage(Clipboard.AsText);
          Clipboard.AsText:= SL[Count + 1];; //place next line text in clipboard
          //if Clipboard.HasFormat(CF_TEXT) then
          //do something with text
          inc(Count);
        end; //while Count <> SL.Count - 1 do
      SL.Free;
  end; //if Appwin <> 0 then


end.

person FernandoSBS    schedule 07.05.2013    source источник
comment
Есть ли красная волнистая линия под названием компонента? Как насчет имени формы? Если да, то что подскажет всплывающая подсказка, когда вы наведете на нее курсор?   -  person Jerry Dodge    schedule 07.05.2013
comment
Не могли бы вы указать источник вашей формы, пожалуйста?   -  person Jerry Dodge    schedule 07.05.2013
comment
Или, по крайней мере, только предложение uses... все единицы, которые использует единица вашей формы.   -  person Jerry Dodge    schedule 07.05.2013
comment
я отредактировал оригинал с кодом.   -  person FernandoSBS    schedule 07.05.2013
comment
строка TextoCompleto:= EditTexto.Text; не будет компилироваться. Вы пропустили строку вроде procedure TForm1.ButtonGOClick(Sender: TObject); непосредственно перед ней? Если нет, обратите внимание, что EditTexto является компонентом формы типа TForm1. На него можно ссылаться только из методов класса TForm1. например ButtonGOClick или используя переменную или поле экземпляра, например переменную Form1 по умолчанию (Form1.EditTexto.Text). Без отсутствующей строки вы добавляете эквивалент раздела инициализации в код модуля.   -  person Gerry Coll    schedule 07.05.2013
comment
Также обратите внимание, что SL, Count and AppWin, вероятно, должны быть локальными переменными.   -  person Gerry Coll    schedule 07.05.2013
comment
Ах, кажется, вы перепутали два разных типа юнитов. То, что вы на самом деле используете, является единицей формы. То, во что вы превратили его, было основным модулем проекта, таким как MyProject.dpr. Эти два стиля юнитов конфликтуют, и вы не должны использовать begin..end. в стандартных юнитах. Вместо этого используйте implementation и отдельные методы/процедуры/функции и т. д. внутри него.   -  person Jerry Dodge    schedule 07.05.2013
comment
Я опубликовал 2 разных кода после того, как узнал, что когда я использую код внутри события кнопки, он работает. Как вы сказали, он должен быть внутри какого-то объекта TForm. последнюю часть о разделе инициализации я не понял.   -  person FernandoSBS    schedule 07.05.2013


Ответы (4)


У вас есть два разных стиля единиц измерения Delphi, смешанные в один. Модуль, с которым вы работаете, — это файл модуля (.pas) за формой. Однако основной файл проекта (.dpr) имеет другой стиль.

Главный файл проекта — единственный, который должен включать раздел begin..end.. С другой стороны, остальные модули должны иметь раздел implementation, в котором находится фактический код для нескольких функций/процедур/методов и т. д.

Итак, в вашем случае вам нужно сохранить блок формы по умолчанию в том виде, в котором он был создан по умолчанию.

Новый основной файл проекта Delphi выглядит примерно так:

program Project1;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

А новый файл стандартного модуля Delphi выглядит примерно так:

unit Unit2;

interface

implementation

end.

Новый файл vcl form unit в Delphi выглядит примерно так:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.

И если вы реализуете какой-либо код...

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure DoSomething;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.DoSomething;
end;

procedure TForm1.DoSomething;
begin
  //Do Something...

end;

end.

Одна из ошибок, которую вы, вероятно, допустили, заключалась в том, что исходный код, который вы добавили в модуль формы, был в форме примера консольного приложения, которое отличается от приложения VCL Forms. Консольное приложение в основном основано на командной строке, которая, кажется, очень распространена для демонстрации примера кода. Однако вы никогда не должны смешивать этот стиль кода со стилем любого другого стандартного стиля модуля.

person Jerry Dodge    schedule 07.05.2013
comment
спасибо за очень хорошо объясненное решение, Джерри. Я не программист и перестал работать с delphi лет 10 назад, даже не помню структуру программы. Теперь я немного более знаком, спасибо. - person FernandoSBS; 07.05.2013
comment
Обратите внимание, что использование begin...end. в файлах pas допустимо - это просто старый способ сказать intialization без предложения finalization. - person Gerry Coll; 08.05.2013
comment
Спасибо @GerryColl, я этого не знал. - person Jerry Dodge; 08.05.2013

Это называется завершением кода. Возможно, вы случайно отключили его в настройках. Посмотрите в разделе Инструменты/Параметры/Параметры редактора/Code Insight и убедитесь, что завершение кода отмечено.

person Dale M    schedule 07.05.2013
comment
Есть много других причин, по которым он может не отображаться, например, единица измерения, не объявленная в предложении uses. - person Jerry Dodge; 07.05.2013
comment
как проверить, не объявлен ли юнит в предложении использования? Одна странность в том, что когда я упоминаю компонент, он его не находит. Пример: если я использую EditBox1.Text, он не находит, но если я использую Form1.EditBox1.Text, он работает. Почему это? - person FernandoSBS; 07.05.2013

Я немного предполагаю, предполагая, что этот код, вставленный выше, не отредактирован.

Я подозреваю, что вам нужно добавить procedure TForm1.ButtonGOClick(Sender: TObject); перед первым begin в вашем коде:

unit Banri;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Clipbrd;

type
  TForm1 = class(TForm)
    EditTexto: TEdit;
    ButtonGO: TButton;
    procedure ButtonGOClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonGOClick(Sender: TObject); // <--- added line
var
  SL: TStringList;                               // <-- moved variables from global to local scope. Form1 needs to remain global
  Count: Integer;
  Appwin : hWnd;
  TextoCompleto: String;
begin
  TextoCompleto:= EditTexto.Text;
  Appwin:= FindWindow(PChar(0),'Banrisul');
  if Appwin <> 0 then
  begin
      StringReplace(TextoCompleto, '.', '', [rfReplaceAll, rfIgnoreCase]);

      SL:= TStringList.Create;
      try
        ExtractStrings([' '], [], PChar(TextoCompleto), SL);
        WriteLn(SL.Text);
        ReadLn;
      finally
        SL.Free;
  end;
      Count:= 0;
      while Count <> SL.Count - 1 do
        begin
          Clipboard.AsText:= SL[Count];; //place text in clipboard
          //if Clipboard.HasFormat(CF_TEXT) then
          //do something with text
          ShowMessage(Clipboard.AsText);
          Clipboard.AsText:= SL[Count + 1];; //place next line text in clipboard
          //if Clipboard.HasFormat(CF_TEXT) then
          //do something with text
          inc(Count);
        end; //while Count <> SL.Count - 1 do
      SL.Free;
  end; //if Appwin <> 0 then


end.
person Gerry Coll    schedule 07.05.2013

Итак, как выяснили другие, проблема заключалась в моей структуре кодирования, которая была невероятно неправильной.

unit Banri;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Clipbrd;

type
  TForm1 = class(TForm)
    EditTexto: TEdit;
    ButtonGO: TButton;
    procedure ButtonGOClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SL: TStringList;
  Count: Integer;
  Appwin : hWnd;

**implementation

{$R *.dfm}

  var
  TextoCompleto: String;



begin
  TextoCompleto:= EditTexto.Text;
  Appwin:= FindWindow(PChar(0),'Banrisul');
  if Appwin <> 0 then**

Как легко заметить, я начал программировать без функции или процедуры. Вот почему «подсказки» (на самом деле называемые «Code Insights», как я также узнал с помощью других) не работали. Delphi не распознавала код как часть чего-либо и поэтому не могла дать представление о коде.

person FernandoSBS    schedule 09.05.2013