Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit zur Laufzeit erzeugten Edits


SnowballTwo - Sa 27.09.08 20:45
Titel: Problem mit zur Laufzeit erzeugten Edits
habe mich nun extra hier angemeldet da ich mich seit Stunden im Kreis drehe

mein Problem ist Folgendes: ich habe ein Array von TEdit objekten, diese werden alle zur Laufzeit beim Erstellen von Form1 in einer for-Schleife erzeugt, und mit ihren Eigenschaften abgesegnet.

Nun brauchte ich für jedes Editfenster ein OnChange event.

ich versuchte dies über:


Delphi-Quelltext
1:
Edit[i,k].OnChange:=TChange;                    

TChange sieht syntaxmäßig folgendermaßen aus

Delphi-Quelltext
1:
2:
3:
procedure TForm1.TChange(Sender: Tobject);
begin
end;

und wurde so deklariert:

Delphi-Quelltext
1:
2:
type
procedure TChange(Sender: Tobject);


funktioniert auch alles wunderbar soweit!

und jetzt das malheur:

ich brauche in der funktion TChange die Koordinaten des Editfensters das gerade geändert wurde, also z.b. Edit[5,5], um damit zu arbeiten. Ich habe nun verzweifelt versucht die Variablen

A: irgendwie über Globale Variablen zu übergeben
B: Als Parameter zu übergeben --> hab mir dazu auch einige tutorials angesehn, aber schon wenn ich TChange = procedure(...) of object; schreibe meckert er über das '=' Zeichen hinter TChange...fehlt mir irgendeine bestimmte unit?
C: habe ich mich gefragt ob ich eventuell herausfinden könnte welches Feld gerade den Focus hat, und darüber die koordinaten bekommen

ich hoffe mein problem kommt klar rüber, helft einem ahnungslosen Anfänger! ;(

habe mein bisheriges wissen von hier [http://www.delphipraxis.net/topic45205.htmlurl]

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt


Marc. - Sa 27.09.08 20:57

Mit Der Eigenschaft Sender kannst Du Deine Edits identifizieren.
Ein simples Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure GetKoordinaten(X,Y:Integer);
begin
   // Berechnungen mit den Koordinaten
end;

procedure TForm1.MyOnChange(Sender: TObject);
begin
 if (Sender is TEdit) then
  GetKoordinaten(TEdit(Sender).Left,
                 TEdit(Sender).Top);
end;

user profile iconSnowballTwo hat folgendes geschrieben:
C: habe ich mich gefragt ob ich eventuell herausfinden könnte welches Feld gerade den Focus hat, und darüber die koordinaten bekommen

Stichwort OnEnter.

Aber ich frage mich gerade, wofür der ganze Aufwand? Berechnest Du nicht zu beginn die Positionen der einzelnen Edits aus? Nun könntest Du doch verbunden mit dem Tag die Koordinaten in einer Liste speichern. ;)

Grüße,
Marc


SnowballTwo - Sa 27.09.08 21:07

Das sieht schon sehr gut aus, allerdings gibt es ein kleines Missverständnis im Bezug auf "koordinaten"

natürlich ist deine interpretation generell richtig, allerdings meinte ich damit nicht die position auf dem Bildschirm, sondern die Position im Array

sicherlich könnte ich aus der koordinatenposition die du mir hier veranschaulicht hast auch die position im array bestimmen, aber ich glaube das wäre nicht ideal.

ich erklärs so: ich habe 9*9 editfenster auf dem screen (ja, ich versuch mich an nem sudoku)

somit wäre z.b. Edit[5,5] das Edit welches exakt in der mitte liegt.

gibt es eine möglichkeit die beiden '5' en aus Sender auszulesen? sie sind ja keine eigenschaften wie top oder left...

edit: in einem array speichern...mh, ja...aber was nutzt mir das, inwiefern soll ich das array dann verwenden, bzw was soll ich da reinschreiben, für jedes Feld gleich die koordinaten? Das is doch im prinzip auch nix anderes als sie nochmal auszurechnen, halt weniger rechenleisungsintensiv...


Marc. - Sa 27.09.08 21:14

Weise jedem Edit beim Erzeugen eine Nummer über den Tag zu (Edit.Tag).
Via abs( Tag-Nummer - (Tag-Nummer div 9) * 9) bekommst Du die Spaltenummer. (Abs gibt den Betrag zurück.)
Mit (Tag-Nummer-1div 9 die Zeilennummer.
Tag beginnend bei 1.


Wenn ich mich jetzt nicht ganz verstan habe, müsste es das bereits sein. cu


SnowballTwo - Sa 27.09.08 21:24

Was es nich alles gibt :D

vielen dank, habs über die vorher benannte methode gemacht, funzt prima!