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 user profile iconNarses: Ü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
    ...
  // Und hier auch nach komplettem Eintragen (2 Klicks?) FDistanceMode ggf. wieder auf False setzen
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

Delphi-Quelltext
1:
2:
3:
xy := not xy;
// am besten einen bitButton nehmen dann kannst du z.B. 
//Einen grünen Haken bei Aktivierung und ein Rotes X bei der Deaktivierung setzen.

in Abfage

Delphi-Quelltext
1:
if xy then punktspeichern;                    


Marc. - Fr 29.05.09 16:48

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconjaenicke 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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
    ...
  // Und hier auch nach komplettem Eintragen (2 Klicks?) FDistanceMode ggf. wieder auf False setzen
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 user profile iconNarses: Ü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... // Oder eben TPaintBox, wie auch immer
    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:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.