Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: FernandoSBSОтветов: 4

Если я не ошибаюсь, в 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.
  • Есть ли красная волнистая линия под названием компонента? Как насчет имени формы? Если да, то что подскажет всплывающая подсказка, когда вы наведете на нее курсор? Jerry Dodge 07.05.2013
  • Не могли бы вы указать источник вашей формы, пожалуйста? Jerry Dodge 07.05.2013
  • Или, по крайней мере, только предложение uses... все единицы, которые использует единица вашей формы. Jerry Dodge 07.05.2013
  • я отредактировал оригинал с кодом. FernandoSBS 07.05.2013
  • строка TextoCompleto:= EditTexto.Text; не будет компилироваться. Вы пропустили строку вроде procedure TForm1.ButtonGOClick(Sender: TObject); непосредственно перед ней? Если нет, обратите внимание, что EditTexto является компонентом формы типа TForm1. На него можно ссылаться только из методов класса TForm1. например ButtonGOClick или используя переменную или поле экземпляра, например переменную Form1 по умолчанию (Form1.EditTexto.Text). Без отсутствующей строки вы добавляете эквивалент раздела инициализации в код модуля. Gerry Coll 07.05.2013
  • Также обратите внимание, что SL, Count and AppWin, вероятно, должны быть локальными переменными. Gerry Coll 07.05.2013

delphidelphi-7

Ответы

Ответ 1 · рейтинг 1 · Jerry Dodge

У вас есть два разных стиля единиц измерения 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. Консольное приложение в основном основано на командной строке, которая, кажется, очень распространена для демонстрации примера кода. Однако вы никогда не должны смешивать этот стиль кода со стилем любого другого стандартного стиля модуля.

Ответ 2 · рейтинг 1 · Dale M

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

Ответ 3 · Gerry Coll

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

Я подозреваю, что вам нужно добавить 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.

Ответ 4 · FernandoSBS

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

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 не распознавала код как часть чего-либо и поэтому не могла дать представление о коде.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы