AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ereignisprogrammierung in Delphi

Ein Thema von mytar · begonnen am 22. Jun 2004 · letzter Beitrag vom 23. Jun 2004
Antwort Antwort
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#1

Ereignisprogrammierung in Delphi

  Alt 22. Jun 2004, 17:33
Jeder von uns kennt die ganz normalen Ereignisse im Objektinspektor (onClick, onExecute).

Aber wie werden diese Ereignisse eigentlich abgefangen?


Ich hab in meinem Programm eine einfache Datenstruktur (Array), ich möchte nun wissen,
wie ich ein Ereignisse schreibe, welches ausgelöst wird, wenn sich etwas im Array ändert.

So wie OnChange (z.B. bei TEdit, u.a), halt nur auf ein Array.

mytar
Francis Obikwelu
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Ereignisprogrammierung in Delphi

  Alt 23. Jun 2004, 08:41
Kann mir hier niemand weiterhelfen?

mytar
Francis Obikwelu
  Mit Zitat antworten Zitat
Benutzerbild von BluesKid
BluesKid

Registriert seit: 2. Sep 2003
Ort: NRW
133 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Ereignisprogrammierung in Delphi

  Alt 23. Jun 2004, 08:54
Moin moin

Wie funktioniert Windows

und

Einführung in die Grundlagen der Win32API Programmierung

Sind glaub ich das was du suchst allerdings denke ich nicht das (ok ich weiß nicht ob) es möglich ist zu überprüfen ob ein Array verändert wurde/wird...


schönen Gruß

Sam
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#4

Re: Ereignisprogrammierung in Delphi

  Alt 23. Jun 2004, 08:55
Ich weiß jetzt nicht ob es genau das ist was du suchst aber such mal hier im DP nach Tastatureingabe abfangen usw. vielleicht hilft das weiter.
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Ereignisprogrammierung in Delphi

  Alt 23. Jun 2004, 09:09
Hat das hier nicht irgendwie mit Ereignissen zu tun?

TMausAnzeige = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of Object; mytar
Francis Obikwelu
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#6

Re: Ereignisprogrammierung in Delphi

  Alt 23. Jun 2004, 09:28
Da ein Array keine Klasse ist, kannst Du einem Array nicht direkt ein Event zuweisen:
Zitat von Delphi OH:
Der beim Eintritt eines Ereignisses ausgeführte Code ist eine Objektmethode
Als Eigenschaft einer Klasse bzw. eines Objekts könntest Du es in etwa so lösen:
Delphi-Quellcode:
type
  TMyArray = ARRAY[0..5] OF Byte;

  { Array bspw. als Eigenschaft von TForm1 }
  TForm1 = class(TForm)
    { ... }
    PROCEDURE ChangeArray(Sender: TObject); // Beispiel für Ereignisbehandlung
  private
    FMyArray : TMyArray; // Hier das Array selbst
    FOnChangeArray : TNotifyEvent; // Event
  public
    PROCEDURE SetMyArray(Value: TMyArray); OVERLOAD; // Routinen zum
    PROCEDURE SetMyArray(index, Value: Byte); OVERLOAD; // Schreiben und
    FUNCTION GetMyArray : TMyArray; // Lesen des Arrays
    PROPERTY OnChangeArray : TNotifyEvent READ FOnChangeArray WRITE FOnChangeArray; // Event
  end;

{...}

{ ************ Array besetzen ************  }
PROCEDURE TForm1.SetMyArray(Value: TMyArray);
BEGIN
  FMyArray := Value;
  IF Assigned(FOnChangeArray) THEN FOnChangeArray(NIL); // <<--- HIER wird Event "ausgelöst"
END;
{ ----------------------}
PROCEDURE TForm1.SetMyArray(index, Value: Byte);
BEGIN
  FMyArray[index] := Value;
  IF Assigned(FOnChangeArray) THEN FOnChangeArray(NIL); // <<--- HIER wird Event "ausgelöst"
END;

{ ************ Array auslesen ************  }
FUNCTION TForm1.GetMyArray : TMyArray;
BEGIN
  result := FMyArray;
END;

{ ********** Beispielanwendung ***********  }
procedure TForm1.Button1Click(Sender: TObject);
VAR
  arr : TMyArray;
  i : Byte;
begin
  // Beispielwerte
  FOR i:=Low(arr) TO High(arr) DO arr[i] := i;
  // Array setzen
  SetMyArray(arr);
  // Einezelnes Feld im Array setzen
  SetMyArray(2,99);
  // Array zurückgeben lassen
  arr := GetMyArray;
  // Ergebnis anzeigen
  ShowMessage(IntToStr(arr[0]) + #10#13 +
              IntToStr(arr[1]) + #10#13 +
              IntToStr(arr[2]) + #10#13 +
              IntToStr(arr[3]) + #10#13 +
              IntToStr(arr[4]) + #10#13);
end;


{ ******* Eregnisbehandlung zuweisen ********  }
procedure TForm1.Button2Click(Sender: TObject);
begin
  OnChangeArray := ChangeArray;
end;

{ *********** Eregnisbehandlung *************  }
procedure TForm1.ChangeArray(Sender: TObject);
begin
  ShowMessage('Array geändert!');
end;
Nicht komplett getestet...
Geht evtl auch einfacher..?
Aber als Beispiel zur Verdeutlichung vielleicht ja ganz brauchbar

Gruß
Stephan
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Ereignisprogrammierung in Delphi

  Alt 23. Jun 2004, 10:42
Hi,

Ein ist klar: Mit nem normalen array ist nicht möglich, da es keinen code gibt, der reagieren könnte. Aber, wie Steve schon sagte, könntest du für dein array einen klassen-wrapper schreiben. Und das würde ich mit einer array-property machen, denn dort kannst du im setter dein 'Onchanged' event auslösen und es würde nach aussen genau wie ein array aussehen
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#8

Re: Ereignisprogrammierung in Delphi

  Alt 23. Jun 2004, 11:15
Ja stimmt, hatte das zunächst probiert, aber da kam wegen des Arrays ein Fehler, kam aber wohl daher, dass ich diese Property auf published statt public gesetzt hatte..

Die Klasse müsste dann an diesen Stellen geändert werden:
Delphi-Quellcode:
  private
    FMyArray : TMyArray;
    FOnChangeArray : TNotifyEvent;
    PROCEDURE SetMyArray(Value: TMyArray);
    FUNCTION GetMyArray : TMyArray;
  public
    PROPERTY OnChangeArray : TNotifyEvent READ FOnChangeArray WRITE FOnChangeArray;
    PROPERTY MyArray : TMyArray READ GetMyArray WRITE SetMyArray;
  end;
Müsste klappen

Gruß
Stephan

edit: Man kann so aber nicht auf die einzelnen Indizes zugreifen: MyArray[3] := 1; --> "Der linken Seite kann nichts zugewiesen werden"!
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#9

Re: Ereignisprogrammierung in Delphi

  Alt 23. Jun 2004, 14:51
Ich meinte eigentlich array-properties, nicht properties eines array-typs

Ungefähr so:

Delphi-Quellcode:
    TArrayWrapper = class;
  TArr = array of integer;
  TOnChanged = procedure (sender:TArrayWrapper) of object;
  
  TArrayWrapper = class(TObject)
  private
    FArr:TArr;
    FOnChanged: TOnChanged;
    function getCount: integer;
    procedure SetCount(const Value: integer);
    function GetItems(Index: Integer): integer;
    procedure SetItems(Index: Integer; const Value: integer);
  public
    constructor Create(aOnChange:TOnChanged);
    destructor Destroy; override;
    property OnChange:TOnChanged read FOnChanged write FOnChanged;
    property Count:integer read getCount write SetCount;
    property Items[Index: Integer]: integer read Getitems write Setitems; default;
  end;
      


implementation



{ TArrayWrapper }

constructor TArrayWrapper.Create(aOnChange: TOnChanged);
begin
  FOnChanged := aOnChange;
end;

destructor TArrayWrapper.Destroy;
begin
  count := 0;
  inherited;
end;

function TArrayWrapper.getCount: integer;
begin
  result := length(FArr);
end;

procedure TArrayWrapper.SetCount(const Value: integer);
begin
  setLength(FArr,Value);
end;

function TArrayWrapper.Getitems(Index: Integer): integer;
begin
  result := FArr[Index];
end;

procedure TArrayWrapper.Setitems(Index: Integer; const Value: integer);
begin
  FArr[Index] := Value;
  if assigned(OnChange) then OnChange(self); // event aufrufen!!!
end;
Du musst dann nur noch eine instanz, mit eventhandler als parameter, erstellen und schon hast du den gewünschten effekt

// edit: items als default-property definiert
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#10

Re: Ereignisprogrammierung in Delphi

  Alt 23. Jun 2004, 15:32
Jooaaa... das is natürlich noch um einiges besser

und gelernt hab ich auch noch was dabei

Gruß
Stephan
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz