Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Самодельный Button, событие Click   Найти похожие ветки 

 
Pavelkq   (2005-10-11 13:41) [0]

Здравствуйте! Создаю в программе форму (create, show. Затем создаю на этой форме кнопку  HelpBut:=TButton.Create(HelpFrm);
 with HelpBut do
 begin
   parent:=HelpFrm;
   Width:=120;
   Height:=20;
   Left:=150;
   Top:=340;
   Caption:=("Название");
 end;

Что надо написать, чтобы можно было сделать подпрограмму обработки события onClick?


 
Ega23 ©   (2005-10-11 13:49) [1]

onClick:=MyButtonClickHandler;


 
Ega23 ©   (2005-10-11 13:51) [2]

Ну и метод формы
procedure MyButtonClickHandler(Sender:TObject);

procedure TForm1.MyButtonClickHandler(Sender:TObject);
begin
ShowMessage("Button clicked!!!");

end;


 
Pavelkq   (2005-10-11 14:32) [3]

Отлично! Работает, т.е. сообщение успешно выскакивает. Но теперь из обработчика не могу достучаться до динамически созданной формы. На динамической форме есть динамически созданный TRichEdit и я бы хотел его очистить по нажатию кнопки. Форма создана: HelpFrm:=TForm.CreateNew(Application);
а TRichEdit:
HelpRich:=TRichEdit.Create(HelpFrm);


 
Desdechado ©   (2005-10-11 14:43) [4]

у тебя есть Sender, у которого есть Parent
намек ясен?


 
Ega23 ©   (2005-10-11 14:47) [5]

Вот, посмотри пример:
function ShowTexLogFile(const aFileName:String):Boolean;
           procedure BtnClearClick(Sender:TObject);
           var
            i:Integer;
            _memo:TMemo;
           begin
            if (Sender is TForm) then
             begin
              With TForm(Sender) do
               begin
                for i:=0 to ComponentCount-1 do
                 if (Components[i] is TMemo) then
                  if UpperCase(TMemo(Components[i]).Name)=UpperCase("memSQLLogMonitor") then
                   begin
                    _memo:=TMemo(Components[i]);
                    _memo.Lines.Clear;
                    _memo.Lines.Add(" ");
                    _memo.Lines.SaveToFile(_memo.Hint);
                    Break;
                   end;
               end;//With TForm(Sender) do
             end;//if (Sender is TForm) then
           end;//procedure BtnClearClick(
var
aForm:TForm;
aPanel:TPanel;
OnClearClick:TMethod;
List:TStringList;
i:Integer;
begin
Result:=False;
//if not FileExists(aFileName) then Exit;
try
 Application.CreateForm(TForm, aForm);
 try
  With aForm do
   begin
    Caption:=aFileName;
    BorderStyle:=bsSingle;
    Height:=500;
    Width:=750;
    Position:=poScreenCenter;
   end;
  With TMemo.Create(aForm) do
   begin
    Parent:=aForm;
    Name:="memSQLLogMonitor";
    Align:=alClient;
    ScrollBars:=ssBoth;
    //Height:=440;
    Clear;
    Hint:=aFileName;
    List:=TStringList.Create;
    if FileExists(aFileName) then
     begin
      List.LoadFromFile(aFileName);
      for i:=List.Count-1 downto 0 do Lines.Add(List.Strings[i]);
     end;
    List.Free;
   end;
  aPanel:=TPanel.Create(aForm);
  With aPanel do
   begin
    Parent:=aForm;
    Height:=45;
    Align:=alBottom;
   end;
  With TButton.Create(aPanel) do
   begin
    Parent:=aPanel;
    Cancel:=True;
    Height:=25;
    Width:=100;
    Font.Size:=10;
    Top:=10; //aPanel.ClientHeight-10;
    Left:=aPanel.Width-110;
    Anchors:=[akTop, akRight];
    Caption:="Закрыть";
    ModalResult:=mrOK;
   end;
  With TButton.Create(aPanel) do
   begin
    Parent:=aPanel;
    Height:=25;
    Width:=100;
    Font.Size:=10;
    Top:=10; //aPanel.ClientHeight-30;
    Left:=aPanel.Width-220;
    Anchors:=[akTop, akRight];
    Caption:="Очистить";
    OnClearClick.Code:=@BtnClearClick;
    OnClearClick.Data:=aForm;
    OnClick:=TNotifyEvent(OnClearClick);
   end;
  aForm.ShowModal;
 finally
  aForm.Free;
 end;
except on E:Exception do
 raise Exception.Create("ShowTexLogFile "+E.Message);
end;
end;


Здесь всё в динамике создаётся.


 
Pavelkq   (2005-10-11 14:51) [6]

Sender, по моему представлению, будет или сама HelpBut (кнопка) или HelpFrm (динамическая форма). У кнопки родитель форма. Ясно, что ричэдит тоже имеет родителем эту форму. По логике надо писать что-то типа:
procedure TForm1.MyButtonClickHandler(Sender:TObject);
begin
Sender.HelpRich.Lines.Clear;
end;

 Но в таком виде это почему-то не работает, поскольку данная процедура ничего не знает об объекте ричэдит.


 
Ega23 ©   (2005-10-11 14:54) [7]


> Но в таком виде это почему-то не работает, поскольку данная
> процедура ничего не знает об объекте ричэдит.


Задавай ему Name и потом по нему обращайся.


 
jack128 ©   (2005-10-11 15:03) [8]

Ega23 ©   (11.10.05 14:47) [5]
procedure BtnClearClick(Sender:TObject);

Ega23 ©   (11.10.05 14:47) [5]
 With TButton.Create(aPanel) do
  begin
   OnClearClick.Code:=@BtnClearClick;
   OnClearClick.Data:=aForm;
   OnClick:=TNotifyEvent(OnClearClick);


А это работает??  я к тому, что вроде процедура должна быть объявлена как procedure BtnClearClick(Self, Sender: TObject); // это же процедура, а не метод, значит Self нужно явно указывать


 
umbra ©   (2005-10-11 15:03) [9]


> Sender.HelpRich.Lines.Clear;


(Sender as THelpFrm).HelpRich.Lines.Clear;

THelpFrm - тип Вашей формы


 
umbra ©   (2005-10-11 15:05) [10]


> (Sender as THelpFrm).HelpRich.Lines.Clear;


Пардон. Точнее

(Sender.Parent as THelpFrm).HelpRich.Lines.Clear;


 
Pavelkq   (2005-10-11 15:14) [11]

Спасибо, конечно, но можно сказать для непродвинутых, куда это писать?
Если прямо в обработчик, то пишет, что Parent неизвестный идентификатор.

 Ega23, если задать имя, то в обработчике это имя все равно не опознается.

Может начать с того, куда писать код обработчика? Я написал сразу после implementation. Пробовал и внутри процедуры динамического создания объектов, то тогда не проходит onClick:=MyButtonClickHandler;
Так же совершенно не идет код onClick.code:=MyButtonClickHandler;


 
Amoeba ©   (2005-10-11 15:25) [12]

Читай вот эту статью:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342


 
umbra ©   (2005-10-11 15:28) [13]


> для непродвинутых


да я сам продвинутый не очень. два поста - две ошибки.
на cамом деле в обработчике нажатия кнопки надо написать


procedure THelpFrm.MyButtonClickHandler(Sender:TObject);
begin
  Self.HelpRich.Lines.Clear;
end;


Здесь Self - объект, в котором вызывается метод, то есть сама форма.


 
Pavelkq   (2005-10-11 15:54) [14]

Не понпмает он что такое HelpRich.
Короче, вот весь код:

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
 procedure MyButtonClickHandler(Sender:TObject);
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyButtonClickHandler(Sender:TObject);
begin
ShowMessage("Button clicked!!!");
Self.HelpRich.Lines.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
 {Procedure MyButtonClickHandler(Sender:TObject);
 begin
 ShowMessage("Button clicked!!!");
 end;}
var HelpFrm:TForm;
   HelpRich: TRichEdit;
   HelpBut: TButton;
   HelpSet: byte;
begin
HelpSet:=1;
HelpFrm:=TForm.CreateNew(Application);
with HelpFrm do
 begin
 Width:=450;
 Height:=410;
 Caption:="Î ïðîãðàììå";
 Position:=poDesktopCenter;
 BorderIcons:=HelpFrm.BorderIcons-[biMinimize];
 BorderIcons:=HelpFrm.BorderIcons-[biMaximize];
 BorderIcons:=HelpFrm.BorderIcons-[biHelp];
 end;

HelpRich:=TRichEdit.Create(HelpFrm);
with HelpRich do
 begin
 parent:=HelpFrm;
 Width:=445;
 Height:=400;
 Align:=alCustom;
 Color:=clInfoBk;
 Enabled:=true;
 TabOrder:=1;
 ScrollBars:=ssVertical;
 ReadOnly:=true;
 Color:=clRed;
 Color:=clInfoBk;
 BorderWidth:=14;
 Font.Name:="Times New Roman";
 Font.Size:=11;
 if HelpSet=1 then
   begin
   SelAttributes.Height:=SelAttributes.Height+5;
   SelAttributes.Style:=[fsBold];
   Lines.Add("          Ïðîãðàììà "Ôîðìèðîâàíèå áàçû".");
   SelAttributes.Style:=[];
   Lines.Add("");
   Lines.Add(" Ï.À.");
   end;
 end;
if HelpSet=1 then
 begin
 HelpBut:=TButton.Create(HelpFrm);
 with HelpBut do
   begin
   parent:=HelpFrm;
   Width:=120;
   Height:=20;
   Left:=150;
   Top:=340;
   Caption:=("Êàê ïîëüçîâàòüñÿ");
   onClick:=MyButtonClickHandler;
   end;
 end;
HelpFrm.Show;
end;

end.


 
Ega23 ©   (2005-10-11 15:55) [15]


> А это работает??  я к тому, что вроде процедура должна быть
> объявлена как procedure BtnClearClick(Self, Sender: TObject);
>


OnClearClick:TMethod;

?


 
Ega23 ©   (2005-10-11 15:59) [16]


> procedure TForm1.Button1Click(Sender: TObject);
>  {Procedure MyButtonClickHandler(Sender:TObject);
>  begin
>  ShowMessage("Button clicked!!!");
>  end;}
> var HelpFrm:TForm;


У тебя не TForm, а TForm1.
Конечно, TForm1 является наследником TForm, но при обращении к TForm1 как к TForm ты не узнаешь ничего о, например, Button1.


 
jack128 ©   (2005-10-11 17:19) [17]

Ega23 ©   (11.10.05 15:55) [15]
OnClearClick:TMethod;


И ??

вообще то процедура должна была быть объявлена так:
procedure BtnClearClick(Self {в этот параметр передается то что ты записал в OnClearClick.Data, то есть форма}, Sender{а вот сюда передется тот контрол, которому собствено кликнули мышой - кнопка}: TObject);

А работает это у тя только потому, что оба этих параметра передаются через регистры проца.  Вот если бы событие использовало модель вызова stdcall(передача параметров через стек) или напрмер событие принемало бы больше 3 параметров, то ты бы схватил AV.


 
Ega23 ©   (2005-10-11 17:57) [18]


> А работает это у тя только потому, что оба этих параметра
> передаются через регистры проца.  Вот если бы событие использовало
> модель вызова stdcall(передача параметров через стек) или
> напрмер событие принемало бы больше 3 параметров, то ты
> бы схватил AV.


Спасибо, учту.


 
umbra ©   (2005-10-11 18:27) [19]


> Не понпмает он что такое HelpRich.

да и не поймет. в коде после выхода из Button1Click нигде не сохраняются указатели на созданные объекты. А поскольку у них нет имен, то и найти их невозможно. Если чуть чуть Ваш код поправить, то будет работать


procedure TForm1.Button1Click(Sender: TObject);
{........................................}
 with HelpRich do
   begin
    {...........................}
    name := "hr";    //ВОТ ДОПОЛНЕНИЕ!!!!!
    {....................................}
  end;

procedure TForm1.MyButtonClickHandler(Sender:TObject);
var
 par: TWinControl;
 cont: TComponent;

begin
ShowMessage("Button clicked!!!");
par := (Sender as TControl).Parent;
cont := par.FindComponent("hr");
if Assigned(cont) then
 (cont as TRichEdit).Lines.Clear;
end;



 
Ega23 ©   (2005-10-11 18:33) [20]

2 umbra ©   (11.10.05 18:27) [19]
par := (Sender as TControl).Parent;
cont := par.FindComponent("hr");
if Assigned(cont) then
(cont as TRichEdit).Lines.Clear;


А теперь прикинь: форма, на ней панель с Align:=alBottom, на панели искомая кнопка. А RichEdit лежит на самой форме с обтеканием Align:=alClient.

Вопрос: чему будет равен cont?


 
umbra ©   (2005-10-11 18:39) [21]


> Вопрос: чему будет равен cont?
>


NIL конечно. Но в представленном автором коде ничего такого нет. Я ж просто пытаюсь дать пример, как можно искать контролы в указанном случае. Если динамически много форм создавать, я бы лично сохранял указатели на них


 
Pavelkq   (2005-10-12 07:10) [22]

[19] Уже лучше, если считать, что компилятор не ругается. Но все равно не работает. Вот какие значения получаются:
par=(FcomponentStyle:[csInheritable];FDoubleBuffered:False;FInImeComposition:False;FDesignSize:(X:0; Y:0))
cont=(FcomponentStyle:[csInheritable])
После выполнения (cont as TRichEdit).Lines.Clear; выводится ошибка Invalid class typecast.


 
Pavelkq   (2005-10-12 07:26) [23]

Извеняюсь, друзья! По невнимательности присвоил имя не тому экземпляру. В действительности все заработало идеально! Огромное спасибо!
С удовольствием читаю статью предложенную Amoeba [12]



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.049 c
1-1129708560
kot1110
2005-10-19 11:56
2005.11.06
Unit-тестирование


14-1129645154
Rem
2005-10-18 18:19
2005.11.06
Кто придумывает анекдоты?


4-1125120110
ndn
2005-08-27 09:21
2005.11.06
Принтер замедляет печать


14-1129266176
Ega23
2005-10-14 09:02
2005.11.06
С днем рождения! 14 октября


1-1129371372
DelphiLexx
2005-10-15 14:16
2005.11.06
Как в TRadioGroup разместить символ δ - дельта?