Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem bei Funktion
Robii - Fr 29.05.09 16:32
Titel: Problem bei Funktion
Hey :)
Ich habe eine Funktion in meinem Programm, mit der man eine Distanza auf einer Karte messen kann.
Wenn man den Knopf klickt, soll sich der Corsur verändern und man muss 2 verschiedene Punkte auf der Karte anklicken.
Ist dies geschehen, wird die Entfernung zwischen den beiden Punkten angezeigt.
Folgendes Problem:
Ich habe meinen Ansatz so gestaltet, das es bei der Karte ein OnKlick gibt, und das wenn Punkt 1 (Tpoin) ungleich 0 ( x & y ) ist, die MauszeigerPosition = Punkt2 gesetzt wird. Das Problem ist nur, das so, immer wenn man auf die Karte klickt der Punkt gespeichert wird, er soll aber nur gespeichert werden, nachdem man auf den Knopf um die Mess-Funktion zu aktiveren, geklickt hat. Wie löse ich dieses Problem?
Grüße.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke - Fr 29.05.09 16:44
Erstelle unter private eine Eigenschaft vom Typ Boolean, die dir angibt, dass der Distanzmessmodus aktiv ist.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| TFormX = class(TForm) ... private FDistanceMode: Boolean;
...
procedure TFormX.btnDistanceModeClick(Sender: TObject); begin FDistanceMode := True; end;
procedure ...MapClick begin if FDistanceMode then ... end; |
Nebenbei: Dein Titel sagt nicht gerade viel über das Thema des Beitrags aus, findest du nicht, dass da ein etwas sinnvollerer Titel passender wäre?
thepaine91 - Fr 29.05.09 16:45
Einfachste Variante wäre
Variable
Delphi-Quelltext
1: 2:
| private xy: Boolean; |
Formular erzeugung.
Delphi-Quelltext
1: 2: 3: 4:
| Form.Create... begin xy = false; end; |
ins OnClick Ereignis
in Abfage
Delphi-Quelltext
1:
| if xy then punktspeichern; |
Marc. - Fr 29.05.09 16:48
thepaine91 hat folgendes geschrieben : |
Einfachste Variante wäre
Globale Variable xy typ Boolean |
Globale Variablen tragen allerdings weder zur Übersicht noch zur besseren Strukturierung bei. Daher besser den Vorschlag von
jaenicke weiter verfolgen. ;)
thepaine91 - Fr 29.05.09 16:51
naja Formular global ^^ war gemeint hab mich ungeschickt ausgedrückt.
Außerdem kann man den Status bei Jeanicke nicht mehr mit einem Klick auf False setzen.
jaenicke - Fr 29.05.09 16:54
Eine globale Variable schwirrt lose in der Unit herum.
Ein Feld eines Formulars ist innerhalb des Formulares, z.B. unter private, deklariert. Eine solches Feld gehört dementsprechend zu der aktuellen Instanz des Formulars und funktioniert also z.B. auch, wenn man das selbe Formular mehrfach anzeigt.
Insofern ist es schlecht das zu verwechseln bzw. falsch zu bezeichnen. ;-)
// EDIT: Ja, Feld
thepaine91 - Fr 29.05.09 16:56
hmm, ja hast auch recht die Bezeichnung ist eigentlich falsch. In meinem Kopf sind sie eben Formular Global. Das versteht leider keiner außer mir.
@Threadersteller
Ob du nun Jaenickes o. meinen Vorschlag übernimmst bleibt dir überlassen.
Anfangs Post abgeändert.
Robii - Fr 29.05.09 17:11
jaenicke hat folgendes geschrieben : |
Erstelle unter private eine Eigenschaft vom Typ Boolean, die dir angibt, dass der Distanzmessmodus aktiv ist. Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| TFormX = class(TForm) ... private FDistanceMode: Boolean;
...
procedure TFormX.btnDistanceModeClick(Sender: TObject); begin FDistanceMode := True; end;
procedure ...MapClick begin if FDistanceMode then ... end; | Nebenbei: Dein Titel sagt nicht gerade viel über das Thema des Beitrags aus, findest du nicht, dass da ein etwas sinnvollerer Titel passender wäre? |
Das ist was ich gebraucht habe, habe aber noch ein Problem beim erweitern.
Undzwar soll, nachdem die 2 Klicks ausgeführt worden sind, ein Srich ( Canvas ) von P1 zu P2 gezogen werden.
Wo füge ich den diese funktion ein ?
Denn bei dem OnClick weiß ich nicht wo ich das einfügen sollte.
Bzw ich müsste überprüfen ob beide Punkte belegt sind und dann den Strich ziehen oder wenn der erste belegt ist und ich den zweiten abspeichere danach die Linien ziehen..!
Grüße
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt, Zitat kenntlich gemacht.
thepaine91 - Fr 29.05.09 17:14
Hast es im Prinzip selbst beantwortet nach der Speicherung des 2. Wertes gleich im Anschluss.
jaenicke - Fr 29.05.09 17:19
Du solltest dir einfach ein zweites Feld benutzen. Und dann im OnClick:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if FDistanceMode then begin if FFirstPoint then begin ... FFirstPoint := False; end else begin ... ImageX.Canvas.MoveTo... ImageX.Canvas.LineTo... end; end; |
// EDIT: Ja, Feld
thepaine91 - Fr 29.05.09 17:22
Hm jo aber solte er die Variable FFirstPoint nicht wieder auf True setzen?
Und jaenicke genau was du geschrieben hast hab ich doch bereits gesagt.
Yogu - Fr 29.05.09 17:28
Kleine
BankFußnote:
jaenicke hat folgendes geschrieben : |
| Eine Eigenschaft eines Formulars ist innerhalb des Formulares, z.B. unter private, deklariert. |
Wenn du es mit Namen so genau nimmst: Das, was du meinst, ist ein
Feld, und keine Eigenschaft. :mrgreen:
Eigenschaften sind nur die Dinger, die man mit
property einleitet. Sie selbst reservieren keinerlei Speicher sondern verweisen nur auf Methoden oder Felder.
jaenicke - Fr 29.05.09 17:29
Äh, ja stimmt, da hab ich selbst nicht aufgepasst. :oops:
Robii - Sa 30.05.09 20:10
Vielen Dank für die Hilfe,
Problem gelöst.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!