Autor Beitrag
Robii
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: Fr 29.05.09 16:32 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 29.05.09 16:44 
Erstelle unter private eine Eigenschaft vom Typ Boolean, die dir angibt, dass der Distanzmessmodus aktiv ist.
ausblenden 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?


Zuletzt bearbeitet von jaenicke am Fr 29.05.09 16:50, insgesamt 3-mal bearbeitet
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 29.05.09 16:45 
Einfachste Variante wäre
Variable
ausblenden Delphi-Quelltext
1:
2:
  private
    xy: Boolean;

Formular erzeugung.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Form.Create...
begin
  xy = false;
end;

ins OnClick Ereignis
ausblenden 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
ausblenden Delphi-Quelltext
1:
if xy then punktspeichern;					


Zuletzt bearbeitet von thepaine91 am Fr 29.05.09 16:59, insgesamt 1-mal bearbeitet
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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.


Zuletzt bearbeitet von thepaine91 am Fr 29.05.09 16:54, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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


Zuletzt bearbeitet von jaenicke am Fr 29.05.09 17:34, insgesamt 1-mal bearbeitet
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 29.05.09 17:14 
Hast es im Prinzip selbst beantwortet nach der Speicherung des 2. Wertes gleich im Anschluss.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 29.05.09 17:19 
Du solltest dir einfach ein zweites Feld benutzen. Und dann im OnClick:
ausblenden 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


Zuletzt bearbeitet von jaenicke am Fr 29.05.09 17:34, insgesamt 1-mal bearbeitet
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 29.05.09 17:29 
Äh, ja stimmt, da hab ich selbst nicht aufgepasst. :oops:
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: Sa 30.05.09 20:10 
Vielen Dank für die Hilfe,
Problem gelöst.