06 Dialoge als Komponente

20 Event an Dialog uebergeben

Selfhtml

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;



zurück