Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Indexen eines Arrays unterschiedliche Proz. zuweisen (https://www.delphipraxis.net/56660-indexen-eines-arrays-unterschiedliche-proz-zuweisen.html)

Airblader 9. Nov 2005 14:01


Indexen eines Arrays unterschiedliche Proz. zuweisen
 
Hiho ;)

Sagen wir, ich habe ein array of TIrgendwas und TIrgendwas ist so definiert:

Delphi-Quellcode:
type
  TIrgendwas = record
    BlaBla: String;
    FooBar: Integer;

    // (*)
    OnDoMyProc: T...?
  end;

...

var
  MyArr: array[0..1] of TIrgendwas;
An der Stelle (*) will ich - sobald im OnKeyDown Return reagiert (also das schaff ich schon *fg*),
dass MyArr[EinInteger].OnDoMyProc ausgeführt wird.
Ich hatte mir nun erstmal gedacht, dass OnDoMyProc vom Typ TNotifyEvent sein sollte, dann könnte ich
zwar eine Prozedur zuweisen...aber wie löse ich sie aus?

Daher meine Frage:
Wie kann ich "OnDoMyProc" eine Prozedur zuweisen, die ausgeführt werden kann, wann ich es will?
(Und jetzt bitte nicht sagen, ich soll beim Reagieren auf Return eine Fallunterscheidung machen *fg*)

Danke schonmal :)

air

Khabarakh 9. Nov 2005 14:04

Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
 
Delphi-Quellcode:
if Assigned(MyArray[i].OnMyMethod) then
  MyArray[i].OnMyMethod(Self);
Meinst du das?

ichbins 9. Nov 2005 14:11

Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
 
machs doch einfach so:

Delphi-Quellcode:
tirgendwas=class
  aldkjf:integer;
  alkadfjdfj:string;
  procedure abc(i:integer);
end;

[...]

var myarray:array[0..1] of tirgendwas;

[...]

procedure tirgendwas.abc(i:integer);
begin
  alkadfjdfj:=inttostr(aldkjf);
  aldkjf:=i;
end;

[...]

procedure tform1.formcreate(...);
var
  i:integer;
begin
  for i:=0 to length(myarray)-1 do
    myarray[i]:=tirgendwas.create;
end;

[...]

//Prozeduraufruf:
myarray[i].abc(17);

Airblader 9. Nov 2005 14:12

Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
 
*hust*
Manchmal gehts eben einfacher als man denkt *fg*

Allerdings gehts noch nicht ganz.
Wie muss denn mein Prozedurkopf und die enstprechende Zuweisung aussehen?

Ich habs im Moment so:

Delphi-Quellcode:
procedure MyProc(Sender: TObject);

...

MyArr[i].OnDoMyProc := MyProc;

...

MyArr[i].OnDoMyProc(Self);
Es kommt beim Prozedurkopf (also 1. Teil im QT) folgende Meldung:

Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'

MfG,
air

P.S.
@ichbins
Ich will die Prozedur ja auch nicht innerhalb des Records deklarieren ;)
Und das will ich ohne Klasse machen, da die Prozedur sich in kein Muster fassen lässt und eine klasse den QT somit unnötig verlängern würde :)

Der_Unwissende 9. Nov 2005 14:22

Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
 
Hi,
muss mal ganz kurz sagen, das QT unnötig verlängert wird finde ich ist mal ein super Satz! Ne ehrlich, weg mit diesen Kommentaren, Programme funktionieren auch ohne! Und die machen den QT nur unnötig lang!

Aber mal ne generelle Frage, du musst doch die Prozedur irgendwann implementieren, wo und wann willst du das denn machen? Also was spricht dort dagegen, es in einer Klasse zu machen?

Airblader 9. Nov 2005 14:25

Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
 
Die prozeduren werden in der Unit ja festgelegt.
Aber wenn ich nun in einer Klasse eine Prozedur festlege, arbeitet die immer mit dem selben Muster,
ich kann höchstens ein paar Parameter wechseln.
Es kann aber sein, dass die Prozeduren, die ich ausführen will, komplett und von grund auf verschieden sind ;)

air
P.S.:
Würde ich in der Prozedur der Klasse übrigens je nach Fallunterscheidung eine andere externe Prozedur ausführen, kommt es nur auf eine kompliziertere Art raus, als die Fallunterscheidung schon bei der Erkennung des Returns durch GetAsyncKeyState zu machen... ;)

@Der_Unwissende
Kommentare erfüllen dann aber wenigstens für den Entwickler einen Sinn.
Fast mein ganzes Projekt ist auf OOP aufgebaut, da spar ich schon nicht dran - aber hier sehe ich keinen Vorteil eine Klasse zu nehmen...

Ultimator 9. Nov 2005 14:35

Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
 
Zitat:

Ich habs im Moment so:

Delphi-Quellcode:
procedure MyProc(Sender: TObject);

...

MyArr[i].OnDoMyProc := MyProc;

...

MyArr[i].OnDoMyProc(Self);
Es kommt beim Prozedurkopf (also 1. Teil im QT) folgende Meldung:

Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
Naja, die Fehlermeldung sagt doch alles aus ;)
MyArray[ i ].OnDoMyProc will einen Zeiger auf eine Methode, was MyProc ja nicht ist, weil es nur eine 'reguläre Prozedur' ist. Luckie hat mal ein Beispiel geschrieben, wie man einen Timer in einer Konsolenanwendung verwenden kann, das Beispiel liegt auf seiner Homepage (ich tu den Link jetz nich posten, weils mir selber schon bei anderen Threads passiert ist, dass Luckie inzwischen die Struktur seiner HP und somit die URL geändert hat). Das ist dann in etwa das gleiche Schema. Du brauchst praktisch ein Objekt, um eine Mehtode zu haben :)


//edit: Noch was *g*
Wenn du auf Delphi 2006 wartest, dann kannst du in records auch Prozeduren und Funktionen definieren, ohne Friemelei ;)
Records sind einfach nicht für Prozeduren gedacht, sondern halt einfach zur Datenspeicherung.

//edit: Noch was :mrgreen:
Das vorangestellte T ist eigentlich für Klassen gedacht, wenn dus bei anderen "Sachen" verwendest, ist das irreführend ;)

//edit: Hab das Ganze mal selber getestet *g*
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Dingsda(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  MyRec = record
   IntBla: integer;
   StrBla: string[255];
   OnDingsda: TNotifyEvent;
  end;

var MyRec1: MyRec;

procedure TForm1.Dingsda(Sender: TObject); // <--- Das klappt, weils jetz ne Methode ist
begin                                      // Würde auch klappen, wenn du statt TForm1 ein Dummyobjekt erzeugst
  ShowMessage(Sender.ClassName);           // Haputsache, MyRec1.OnDingsda zeigt auf eine Methode
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyRec1.IntBla := 234;
  MyRec1.StrBla := 'Hallo auch';
  MyRec1.OnDingsda := Dingsda;
  MyRec1.OnDingsda(self);
end;

Der_Unwissende 9. Nov 2005 14:49

Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
 
Zitat:

Zitat von Airblader
Die prozeduren werden in der Unit ja festgelegt.
@Der_Unwissende
Kommentare erfüllen dann aber wenigstens für den Entwickler einen Sinn.
Fast mein ganzes Projekt ist auf OOP aufgebaut, da spar ich schon nicht dran - aber hier sehe ich keinen Vorteil eine Klasse zu nehmen...

Nun ja, ich seh halt keinen Vorteil darin nur fast das ganze Projekt auf OOP aufzubauen, aber vielleicht nur Geschmacksache. Jedenfalls nimmt ein Record immer Speicher ein, eine Klasse halt nur wenn gebraucht (immer nur bei schlechter Programmierung oder sehr global benötigten Klassen)

Airblader 9. Nov 2005 14:56

Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
 
@Ultimator

Danke :) Werde das mal so umbauen ;)
Ich dachte bisher immer das 'T' steht für Type, was für mich eig. nix mit Klassen zu tun hat, schließlich stehen Records nicht umsonst bei "type" :stupid: ;)

air

Khabarakh 9. Nov 2005 15:00

Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
 
Das Problem an Methoden <-> lokale/globale Prozeduren ist eben, dass die Methoden noch einen versteckten Self-Parameter mitführen.
Zitat:

Zitat von Ultimator
//edit: Noch was :mrgreen:
Das vorangestellte T ist eigentlich für Klassen gedacht, wenn dus bei anderen "Sachen" verwendest, ist das irreführend ;)

Wo hast du denn das her :gruebel: ? In der gesamten RTL/VCL wirst du keinen Typen (außer primitiven) finden, der keinen T-Prefix besitzt (z.B. TNotifyEvent -> Funktionszeiger, TPoint -> Record, usw.).


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 Uhr.
Seite 1 von 2  1 2      

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