Avatar billede js_delphi Nybegynder
18. marts 2009 - 23:04 Der er 8 kommentarer og
1 løsning

Frames og events.

Hej,

en Frame indeholder en TButton (Button1).
Denne Frame bliver trukket ind paa Form1.

Hvordan er det nu muligt at aktivere en procedure i Form1's unit, naar der trykkes paa Button1 paa Framen, uden at tilgaa Form1 direkte fra Framen (Jeg tilgaar properties i Framen direkte fra Form1, og vil ikke have dette til at gaa i begge retninger)?
Dvs., jeg vil ikke have Form1 (Unit1) staaende i uses listen i Framen, men taenkte paa, at Button1.OnClick eventen fra Framen maaske kunne opsnappes af Form1 paa en eller anden maade.

Paa forhaand tak for hjaelp!
Avatar billede a_nor Nybegynder
19. marts 2009 - 10:00 #1
Du kan evt. anvende PostMessage eller lign. ??

I Unit1:

Type

Form1
..
..

Protected
    procedure XCatch(var Message: TMessage); message Xm_Catch;


I Skemas OnKeypress    :

var Xmes: tMessage;
    x    : tComponent;
begin
x := application.FindComponent('Form1'); 
xMes.Msg    := xm_Catch;
xMes.LParam := Parameter1;
if x <> nil then
if x is tForm then
  Postmessage(tForm(x).Handle,xm_catch,0,xMes.LParam); 
end;

mvh.
Avatar billede kroning Nybegynder
19. marts 2009 - 18:59 #2
Det kan du gøre ganske enkelt ved at benytte framens parent property, f.eks.:

Her sættes ejer formens farve til rød når der trykkes på framens button:

procedure TFrame2.Button1Click(Sender: TObject);
begin
    (Self.Parent as TForm).Color:=clred;
end;
Avatar billede hrc Mester
19. marts 2009 - 22:05 #3
Du kan enten sende en message, men den ryger i en (message)kø hvorved der kan være en lille forsinkelse. Det afhænger helt af hvor belastet maskinen er - det må du teste med GetTickCount.

unit UMessage;

interface

uses
  Messages;

const
  // Brugeroprettede messages skal komme efter WM_USER
  WM_MYMESSAGE = WM_USER + $01;

...

unit FMain;

uses
  .. UMessages;

type
  TfrmMain = class(TForm)
    procedure HandleMyMessage(var aMessage: TMessage); message WM_MYMESSAGE;
  ...

procedure TfrmMain.HandleMyMessage(var aMessage: TMessage);
var
  Sender: TObject; // Here actualle a TFrame
  ItemNo: integer;
  ItemState: integer;
begin
  Sender := TObject(aMessage.WParam);
  ItemNo := aMessage.LParam and $FFFF;
  ItemState := aMessage LParam shr $10;
end;

unit FRMyFrame;

uses
  ... UMessages;

procedure TfrmeMyFrame.Button1Click(Sender: TObject);
var
  ItemNo: integer; // Number of item to manipulate
  ItemState: integer; // State 0: off, 1: on
begin
  ItemNo = 5;
  ItemState := 0;
  Application.Mainform.Perform(WM_MYMESSAGE,integer(self),ItemNo or ItemState shl $10);
end;
Avatar billede hrc Mester
19. marts 2009 - 22:23 #4
Et alternativ er et Call-back event:

type
  TItemButtonEvent = procedure (Sender: TObject; const aItemNo, aItemState: integer) of object;
 
  TfrmeMyFrame = class(TFrame)
  private
    fOnItemButtonEvent: TItemButtonEvent;
  public
    property OnItemButton: TItemButtonEvent read fOnItemButton write fOnItemButton;
  end;
..

type
  TfrmMain = class(TForm)
    procedure HandleItemButtonEvent(Sender: TObject; const aItemNo, aItemState: integer);

I proceduren der sætter framene op:

var
  MyFrame: TfrmeMyFrame;
begin
  MyFrame := TfrmeMyFrame.Create(self);
  MyFrame.OnInputButtonEvent := HandleImageButtonEvent;
  ...
end;
Avatar billede js_delphi Nybegynder
20. marts 2009 - 10:16 #5
Tak for inputs indtil videre!
Jeg kigger paa de forskellige forslag en gang i weekenden.

Paa genhoer!
Avatar billede js_delphi Nybegynder
24. marts 2009 - 10:52 #6
Jeg endte med at bruge PostMessage, selvom jeg synes, det er en maerkelig maade at kommunikere paa internt i et program.

kroning, med din metode kan jeg ikke kalde en procedure i Form1, da min procedure ikke er faelles for TForm.

a_nor og HRC, laegger I lige svar.

Tak for hjaelpen!
Avatar billede a_nor Nybegynder
24. marts 2009 - 16:24 #7
Enig i din betragtning - ikke specielt objektorienteret - havde brugt løsningen i en anden sammenhæng.
mvh
Avatar billede martinlind Nybegynder
29. marts 2009 - 13:45 #8
js-delphi > Windows er message orienteret, så det er lidt den tanke gang man skal ha' for at kode i windows :-)

Prøv f.eks. at åbne en outlook i mail vinduet, når du så klikker på kalender vinduet og kigger på den lille mini-kalender kan du se et tydeligt eks. på at ms også bruger messages, dine aftaler kan være op til 30-60 sec. om at blive markeret med fed.
Avatar billede hrc Mester
03. maj 2009 - 21:53 #9
martinlind: det at der er ventetid i Outlook kan ligeså godt skyldes at en tråd af som opdaterer efter en tung forespørgsel til exchange-serveren er udført. Eller hvad?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester