Form.Execute

Насколько я понял то Form.Execute(Value) - это закрытие формы.Типа как Close.Но на эту строку выдаёт Undeclared identifier 'Execute'.Когда выпадает список с функциями то почему то там нету Execute, зато есть ExecuteAction.В чем дело?Value типа byte.
13 ответов

Насколько я понял то Form.Execute(Value) - это закрытие формы.
Мягко говоря - неверно.Если открыть словарик, то видно, что Execute = выполнить, исполнить.
Но на эту строку выдаёт Undeclared identifier 'Execute'.
Правильно. Нет такого метода.Close есть.


Вот кусок кода:
procedure TForm1.Button2Click(Sender: TObject); var PixelArray:array of Byte; Value:Byte; CurrentLine:pByteArray; BoxCurrentLine:pByteArray; Vert,Hor:Integer; VertB,HorB:Integer; Counter:Integer; Temp:Byte;begin ValueForm.Caption := 'Размер окна фильтра n X n'; ValueForm.TrackBar1.Min := 3; ValueForm.TrackBar1.Max := 9; ValueForm.TrackBar1.Frequency := 2; ValueForm.Edit1.ReadOnly := True; if ValueForm.Execute(Value) then begin  SetLength(PixelArray,Value*Value);  if Image1.Picture.Bitmap.PixelFormat = pf8bit then  begin   for Vert := 0 to Image1.Picture.Bitmap.Height - 1 do   begin    CurrentLine := Image1.Picture.Bitmap.ScanLine[Vert];    for Hor := 0 to Image1.Picture.Bitmap.Width - 1 do    begin     // Заносим все пиксели окошка в массив     Counter := 0;     for VertB := (Vert - (Value div 2)) to (Vert + (Value div 2)) do     begin      if (VertB >= 0) and (VertB < Image1.Picture.Bitmap.Height) then       BoxCurrentLine := Image1.Picture.Bitmap.ScanLine[VertB];      for HorB := (Hor - (Value div 2)) to (Hor + (Value div 2)) do      begin       if (HorB >= 0) and (VertB >= 0) and          (HorB < Image1.Picture.Bitmap.Width) and          (VertB < Image1.Picture.Bitmap.Height) then        PixelArray[Counter] := BoxCurrentLine^[HorB]       else        PixelArray[Counter] := 0;       Inc(Counter);      end;     end;
Это фильтр изображений.Код писал не я.Пытаюсь разобраться.Если не использовать Execute, то как тогда инициализировать переменную Value?


Ну здесь явно, метод Execute - самописный.Смотри его реализацию там, где описан класс ValueForm.Судя по коду, Value - это Var параметр, который и настраивается диалогом ValueForm.Из кода видно, что в диалоге ValueForm есть трэкбар, которым выбирается число.Это число прописывается в Value и далее используется для выделения динамического массива.А вот что тебе нужно - совершенно не понятно.Execute - не является стандартным методом и скорее всего описан где-то в другом файле.


Ну здесь явно, метод Execute - самописный.Смотри его реализацию там, где описан класс ValueForm.
Так этого класса как раз и нету.Т.е. есть только то что я выложил.


Вот что мне нужно:Когда появляется вторая форма, и на трэкбаре выбирается число, это число записывалось в переменную Value.Как это реализовать?Т. е. наверное правильней было бы поставить вопрос - как работать с трэкбаром?


Значит тебе нужно воссоздать эту форму.Во-первых, у второй формы метод Execute должен быть описан, какprocedure Execute(var Value: byte);Во-вторых, на форме должна быть кнопочка Ок, у которой Kind должен быть прописан как Ок.В методе Execute должен быть вызов ShowModal, после которого нужно прописатьValue := TrackBar1.Position;


Значит тебе нужно воссоздать эту форму.Во-первых, у второй формы метод Execute должен быть описан, какprocedure Execute(var Value: byte);Во-вторых, на форме должна быть кнопочка Ок, у которой Kind должен быть прописан как Ок.В методе Execute должен быть вызов ShowModal, после которого нужно прописатьValue := TrackBar1.Position;
Так?
procedure Execute(var Value:Byte)begin     ValueForm:ShowModal;  If ValueForm.ModalResult=mrOk then  //если пользователь нажал на кнопку Ok, то     begin     Value:= TrackBar1.Position;     Exit; //выйти из этой ************;end;


ну почти так.Если не принимать в счёт синтаксические ошибки, то 2 поправки:1. Execute - это функция, возвращающая boolean,  а не процедура.2. Если ModalResult = mrOk, то result := true, else result := false;


Значит тебе нужно воссоздать эту форму.
File -> New -> Other -> Dialog...Но дальше что будет не известно. Очень трудно использовать чужой код, если его нет.


type  TValueForm = class(TForm)    TrackBar1: TTrackBar;  private    { Private declarations }  public    function Execute(var Value: Byte): Boolean;  end;var  ValueForm: TValueForm;implementation{$R *.dfm}function TValueForm.Execute(var Value: Byte): Boolean;begin  Result := (ShowModal = mrOk);  if Result then    Value := TrackBar1.Position;end;


Всем ГИГАспасибо!!!Добавлено через 11 минут и 34 секундыИзвиняюсь за беспокойство, но гляньте кто-нибудь что здесь не доделано.Выдаёт [Warning] Median.pas(114): Variable 'BoxCurrentLine' might not have been initialized.Вот весь код:
unit Median;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ExtDlgs, ExtCtrls, StdCtrls;type  TForm1 = class(TForm)    Image1: TImage;    Button1: TButton;    Button2: TButton;    OpenPictureDialog1: TOpenPictureDialog;    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;  iw,ih: integer; // первоначальный размер компонента Imageimplementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin  if OpenPictureDialog1.Execute then     Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);end;procedure Scalelmage;varpw, ph : integer; // размер иллюстрацииscaleX, scaleY : real; // масштаб по Х и Yscale : real; // общий масштабbegin// иллюстрация уже загружена// получим ее размерыpw := Form1.Image1.Picture.Width;ph := Form1.Image1.Picture.Height;if pw > iw // ширина иллюстрации больше ширины компонента Imagethen scaleX := iw/pw // нужно масштабироватьelse scaleX := 1;if ph > ih // высота иллюстрации больше высоты компонентаthen scaleY := ih/ph // нужно масштабироватьelse scaleY := 1;// выберем наименьший коэффициент if scaleX < scaleYthen scale := scaleXelse scale := scaleY;// изменим размер области вывода иллюстрацииForm1.Image1.Height := Round(Form1.Image1.Picture.Height*scale);Form1.Image1.Width := Round(Form1.Image1.Picture.Width*scale);// т. к. Strech = True и размер области пропорционален// размеру картинки, то картинка масштабируется без ************;procedure TForm1.Button2Click(Sender: TObject); var PixelArray:array of Byte; Value:Byte; CurrentLine:pByteArray; BoxCurrentLine:pByteArray; Vert,Hor:Integer; VertB,HorB:Integer; Counter:Integer; Temp:Byte;begin ValueForm.Caption := 'Размер окна фильтра n X n'; ValueForm.TrackBar1.Min := 3; ValueForm.TrackBar1.Max := 9; ValueForm.TrackBar1.Frequency := 2; ValueForm.Edit1.ReadOnly := True; if ValueForm.Execute(Value) then begin  SetLength(PixelArray,Value*Value);  if Image1.Picture.Bitmap.PixelFormat = pf8bit then  begin   for Vert := 0 to Image1.Picture.Bitmap.Height - 1 do   begin    CurrentLine := Image1.Picture.Bitmap.ScanLine[Vert];    for Hor := 0 to Image1.Picture.Bitmap.Width - 1 do    begin     // Заносим все пиксели окошка в массив     Counter := 0;     for VertB := (Vert - (Value div 2)) to (Vert + (Value div 2)) do     begin      if (VertB >= 0) and (VertB < Image1.Picture.Bitmap.Height) then       BoxCurrentLine := Image1.Picture.Bitmap.ScanLine[VertB];      for HorB := (Hor - (Value div 2)) to (Hor + (Value div 2)) do      begin       if (HorB >= 0) and (VertB >= 0) and          (HorB < Image1.Picture.Bitmap.Width) and          (VertB < Image1.Picture.Bitmap.Height) then        PixelArray[Counter] := BoxCurrentLine^[HorB]       else        PixelArray[Counter] := 0;       Inc(Counter);      end;     end;     // Сортируем массив     for VertB := 0 to Value*Value - 1 do     begin      for HorB := VertB to Value*Value - 1 do      begin       if PixelArray[VertB] > PixelArray[HorB] then       begin        Temp := PixelArray[VertB];        PixelArray[VertB] := PixelArray[HorB];        PixelArray[HorB] := Temp;       end;      end;     end;     // Берем то что посередине и присваиваем текущему пикселю     CurrentLine^[Hor] := PixelArray[((Value*Value) div 2) + 1];    end;   end;   Image1.Visible := False;   Image1.Visible := True;  end  else   MessageBox(Handle,'Такой формат файла пока не подерживается...',                     'Message',MB_OK or MB_ICONSTOP or  MB_APPLMODAL); end;end;end.


Barabeo, [Warning] Median.pas(114): Variable 'BoxCurrentLine' might not have been initialized.Значит, что при некоторых условиях к BoxCurrentLine может быть ничего не присвоено.В принципе можно забить - но надо быть уверенным, что не начнешь использовать BoxCurrentLine до того как присвоишь ему что то.в твоем случае:
      if (VertB >= 0) and (VertB < Image1.Picture.Bitmap.Height) then       BoxCurrentLine := Image1.Picture.Bitmap.ScanLine[VertB];...       if (HorB >= 0) and (VertB >= 0) and          (HorB < Image1.Picture.Bitmap.Width) and          (VertB < Image1.Picture.Bitmap.Height) then        PixelArray[Counter] := BoxCurrentLine^[HorB]       else        PixelArray[Counter] := 0;
вроде как все нормально.


Ещё небольшой вопрос - как изменение значений Трэкбара вывести на Label?