06 Dialoge als Komponente
20 Event an Dialog uebergeben
In diesem Beispiel wird gezeigt, wie man ein Event an eine andere Komponente senden kann.
In diesem Fall wird ein Event an die Dialoge gesendet. In den Dialogen wird dann ein Counter hochgezählt.
Events für den Buttonklick.
const
cmDia1 = 1001;
cmDia2 = 1002;
Hier werden die 2 passiven Ausgabe-Dialoge erstellt, dies befinden sich in dem Object TMyDialog.
Auserdem wird ein Dialog erstellt, welcher 2 Button erhält, welche dann Kommandos an die andren Dialoge sendet.
constructor TMyApp.Init;
var
Rect: TRect;
Dia: PDialog;
begin
inherited init;
// erster passsiver Dialog
Rect.Assign(45, 2, 70, 9);
Dialog1 := New(PMyDialog, Init(Rect, 'Dialog 1'));
Dialog1^.SetState(sfDisabled, True); // Dialog auf ReadOnly.
if ValidView(Dialog1) <> nil then begin // Prüfen ob genügend Speicher.
Desktop^.Insert(Dialog1);
end;
// zweiter passsiver Dialog
Rect.Assign(45, 12, 70, 19);
Dialog2 := New(PMyDialog, Init(Rect, 'Dialog 2'));
Dialog2^.SetState(sfDisabled, True);
if ValidView(Dialog2) <> nil then begin
Desktop^.Insert(Dialog2);
end;
// Steuerdialog
Rect.Assign(5, 5, 30, 17);
Dia := New(PDialog, Init(Rect, 'Steuerung'));
with Dia^ do begin
Rect.Assign(6, 2, 18, 4);
Insert(new(PButton, Init(Rect, 'Dialog ~1~', cmDia1, bfNormal)));
Rect.Assign(6, 5, 18, 7);
Insert(new(PButton, Init(Rect, 'Dialog ~2~', cmDia2, bfNormal)));
Rect.Assign(6, 9, 18, 11);
Insert(new(PButton, Init(Rect, '~B~eenden', cmQuit, bfNormal)));
end;
if ValidView(Dia) <> nil then begin
Desktop^.Insert(Dia);
end;
end;
Hier werden mit Message, die Kommandos an die Dialoge gesendet.
procedure TMyApp.HandleEvent(var Event: TEvent);
var
MyDialog: PMyDialog;
begin
inherited HandleEvent(Event);
if Event.What = evCommand then begin
case Event.Command of
cmDia1: begin
Message(Dialog1, evCommand, cmCounterUp, nil); // Kommando Dialog 1
end;
cmDia2: begin
Message(Dialog2, evCommand, cmCounterUp, nil); // Kommando Dialog 2
end;
else begin
Exit;
end;
end;
end;
ClearEvent(Event);
end;
Unit mit dem neuen Dialog.
Der Dialog mit der Zähler-Ausgabe.
unit MyDialog;
Deklaration des Object der passiven Dialoge.
type
PMyDialog = ^TMyDialog;
TMyDialog = object(TDialog)
var
CounterInputLine: PInputLine; // Ausgabe Zeile für den Counter.
constructor Init(var Bounds: TRect; ATitle: TTitleStr);
procedure HandleEvent(var Event: TEvent); virtual;
end;
Im Konstructor wird eine Ausgabezeile erzeugt.
constructor TMyDialog.Init(var Bounds: TRect; ATitle: TTitleStr);
var
Rect: TRect;
begin
inherited Init(Bounds, ATitle);
Rect.Assign(5, 2, 10, 3);
CounterInputLine := new(PInputLine, Init(Rect, 20));
CounterInputLine^.Data^ := '0';
Insert(CounterInputLine);
end;
Im EventHandle wird das Kommando empfangen, welches mit Message gesendet wurde.
Als Beweis dafür, wir die Zahl in der Ausgabezeile un eins erhöht.
procedure TMyDialog.HandleEvent(var Event: TEvent);
var
Counter: integer;
begin
inherited HandleEvent(Event);
case Event.What of
evCommand: begin
case Event.Command of
cmCounterUp: begin // cmCounterUp wurde mit Message gesendet.
Counter := StrToInt(CounterInputLine^.Data^); // Ausgabezeile auslesen.
Inc(Counter); // Counter erhöhen.
CounterInputLine^.Data^ := IntToStr(Counter); // Neue Zahl ausgeben.
CounterInputLine^.Draw; // Asugabezeile aktualisieren.
ClearEvent(Event); // Event beenden.
end;
end;
end;
end;
end;