Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Procedure während gedrückthalten eines Buttons (https://www.delphipraxis.net/204226-procedure-waehrend-gedrueckthalten-eines-buttons.html)

F1nal 8. Mai 2020 13:23

Delphi-Version: 10.3 Rio

Procedure während gedrückthalten eines Buttons
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anhang 52469 <- Bild der Aufgabe

Wir haben als Schulaufgabe, diese Aufgabe bekommen. Ich und meine Freunde verzweifeln nun aber schon seit heute morgen und wissen nicht wie wir dass mit dem gedrückthalten machen sollen. Ich hoffe uns kann hier wer helfen. Ein nachfragen beim Lehre ist aktuell leider nicht möglich weshalb ich hier nachfrage.

Vielen Dank!
Leon

Der schöne Günther 8. Mai 2020 13:28

AW: Procedure während gedrückthalten eines Buttons
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo-

Die "Befehlsschaltfläche" ist wohl ein ganz normaler
Delphi-Quellcode:
TButton
, richtig?

Ihr habt gesehen dass es für den Button nicht nur
Delphi-Quellcode:
OnClick
gibt, oder? Protipp: Es hat was mit der Maus zu tun.

F1nal 8. Mai 2020 13:30

AW: Procedure während gedrückthalten eines Buttons
 
Ja es handelt sich um einen normalen Button, wir haben auch die anderen Ereignisse gesehen wissen jedoch nicht welche dass tut, was wir möchten.

DieDolly 8. Mai 2020 13:35

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Ja es handelt sich um einen normalen Button, wir haben auch die anderen Ereignisse gesehen wissen jedoch nicht welche dass tut, was wir möchten.
Probieren geht über studieren. Oder einfach in der Doku nachgucken.

F1nal 8. Mai 2020 13:44

AW: Procedure während gedrückthalten eines Buttons
 
Delphi-Quellcode:
procedure TF_TagNacht.Bt_BlitzMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  B := true;
  if B = true then
    begin
     Im_Wolke1.Picture.LoadFromFile('Regen.ico');
    end;
end;

procedure TF_TagNacht.Bt_BlitzMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 B := false;
  if B = false then
    begin
     Im_Wolke1.Picture.LoadFromFile('Wolke.ico');
    end;
end;
Wir haben es jetzt nach ein bisschen rumprobieren so gelöst. Danke für den Tipp mit der Maus. Wir waren davon ausgegangen dass diese Ereignisse nur für bewegungen mit der Maus sind.

DieDolly 8. Mai 2020 13:45

AW: Procedure während gedrückthalten eines Buttons
 
Nicht auf True und False vergleichen :warn:
Und wenn dann vereinfachen

Delphi-Quellcode:
procedure TF_TagNacht.Bt_BlitzMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Im_Wolke1.Picture.LoadFromFile('Regen.ico');
end;

procedure TF_TagNacht.Bt_BlitzMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Im_Wolke1.Picture.LoadFromFile('Wolke.ico');
end;
Zitat:

Wir waren davon ausgegangen dass diese Ereignisse nur für bewegungen mit der Maus sind.
Dafür gibt es MouseMove.

F1nal 8. Mai 2020 13:46

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von DieDolly (Beitrag 1464020)
Nicht auf True und False vergleichen :warn:
Und wenn dann vereinfachen

Delphi-Quellcode:
procedure TF_TagNacht.Bt_BlitzMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Im_Wolke1.Picture.LoadFromFile('Regen.ico');
end;

procedure TF_TagNacht.Bt_BlitzMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Im_Wolke1.Picture.LoadFromFile('Wolke.ico');
end;

Ok und warum nicht?

DieDolly 8. Mai 2020 13:46

AW: Procedure während gedrückthalten eines Buttons
 
Das können andere besser erklären als ich. Man macht es einfach nicht, da es nicht korrekt ist und zu Fehlern führen kann. Man vergleicht mit
Delphi-Quellcode:
if B then
und
Delphi-Quellcode:
if not B then
. Aber das ganze Boolean-Zeug brauchst du da nicht.

Sherlock 8. Mai 2020 13:46

AW: Procedure während gedrückthalten eines Buttons
 
Klasse! :thumb:

In der Tat ist es auf den ersten Blick verwirrend, MouseDown/MouseUp zu sagen, aber angesichts von MouseMove (das sich um alle Bewegungen der Mouse im Bereich des Buttons kümmert) und dem Drang von Entwicklern doch irgendwie kurze Namen haben zu wollen, hat man eben statt OnMouseButtonDown nur OnMouseDown.

Sherlock

Der schöne Günther 8. Mai 2020 13:47

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von DieDolly (Beitrag 1464020)
Und wenn dann vereinfachen

Zitat:

Zitat von DieDolly (Beitrag 1464022)
Aber das ganze Boolean-Zeug brauchst du da nicht.

Wenn man das jemandem schon so hinknallt sollte man auch etwas genauer hinsehen.

Weißt du ob das B nicht irgendeinen Sinn hatte? Der Vergleich auf B war überflüssig, ja, aber ob es das Setzen von B auch war kann niemand außer ihm selbst beurteilen.

Hobbycoder 8. Mai 2020 13:49

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von F1nal (Beitrag 1464018)
Delphi-Quellcode:
procedure TF_TagNacht.Bt_BlitzMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  B := true;
  if B = true then
    begin
     Im_Wolke1.Picture.LoadFromFile('Regen.ico');
    end;
end;

procedure TF_TagNacht.Bt_BlitzMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 B := false;
  if B = false then
    begin
     Im_Wolke1.Picture.LoadFromFile('Wolke.ico');
    end;
end;
Wir haben es jetzt nach ein bisschen rumprobieren so gelöst. Danke für den Tipp mit der Maus. Wir waren davon ausgegangen dass diese Ereignisse nur für bewegungen mit der Maus sind.

2 Sachen sind mir dabei gleich aufgefallen.

1) Wenn du in einer Zeile B auf True oder False setzt, dann brauchst du nicht in der darauffolgenden Zeile genau das wieder per If abfragen. Logischerweise kann B dann gar keinen anderen Zustand haben.

2) NIEMALS
Delphi-Quellcode:
IF B = True then
. If erwartet in der Bedingung ein boolsches Ergebnis. B ist abet schon eine Boolsche Variable. Einzig richtig wäre hier
Delphi-Quellcode:
IF B then...
oder
Delphi-Quellcode:
IF not B then ...
So sieht das besser aus:
Delphi-Quellcode:
procedure TF_TagNacht.Bt_BlitzMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  B := true;
  Im_Wolke1.Picture.LoadFromFile('Regen.ico');
end;

procedure TF_TagNacht.Bt_BlitzMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 B := false;
 Im_Wolke1.Picture.LoadFromFile('Wolke.ico');
end;

Sherlock 8. Mai 2020 13:49

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von F1nal (Beitrag 1464021)
Zitat:

Zitat von DieDolly (Beitrag 1464020)
Nicht auf True und False vergleichen :warn:

Ok und warum nicht?

Hauptgrund für mich:
Es liest sich einfach besser. Delphi bzw. ObjectPascal ist eine Sprache. Was würdest Du eher sagen: "Wenn es regnet wahr ist, dann mache ich meinen Regenschirm auf" oder "Wenn es regnet, dann mache ich meinen Regenschirm auf"?

Sherlock

DieDolly 8. Mai 2020 13:52

AW: Procedure während gedrückthalten eines Buttons
 
Wenn du den Status der einzelnen Bilder brauchst, wären vielleicht Enums nicht verkehrt. Eher sogar ein Set. Aber das geht zu weit. Würde deinen Lehrer aber vielleicht staunen lassen.

F1nal 8. Mai 2020 13:53

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von Sherlock (Beitrag 1464027)
Zitat:

Zitat von F1nal (Beitrag 1464021)
Zitat:

Zitat von DieDolly (Beitrag 1464020)
Nicht auf True und False vergleichen :warn:

Ok und warum nicht?

Hauptgrund für mich:
Es liest sich einfach besser. Delphi bzw. ObjectPascal ist eine Sprache. Was würdest Du eher sagen: "Wenn es regnet wahr ist, dann mache ich meinen Regenschirm auf" oder "Wenn es regnet, dann mache ich meinen Regenschirm auf"?

Sherlock

Ja das ist wohl war, der erste Satz klingt recht komisch.

Hobbycoder 8. Mai 2020 13:54

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von F1nal (Beitrag 1464021)
Zitat:

Zitat von DieDolly (Beitrag 1464020)
Nicht auf True und False vergleichen :warn:
Und wenn dann vereinfachen

Delphi-Quellcode:
procedure TF_TagNacht.Bt_BlitzMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Im_Wolke1.Picture.LoadFromFile('Regen.ico');
end;

procedure TF_TagNacht.Bt_BlitzMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Im_Wolke1.Picture.LoadFromFile('Wolke.ico');
end;

Ok und warum nicht?

Sieht hier Ist nicht immer nur eine Frage der "Schönheit"

F1nal 8. Mai 2020 13:57

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von Hobbycoder (Beitrag 1464025)

2 Sachen sind mir dabei gleich aufgefallen.

1) Wenn du in einer Zeile B auf True oder False setzt, dann brauchst du nicht in der darauffolgenden Zeile genau das wieder per If abfragen. Logischerweise kann B dann gar keinen anderen Zustand haben.

2) NIEMALS
Delphi-Quellcode:
IF B = True then
. If erwartet in der Bedingung ein boolsches Ergebnis. B ist abet schon eine Boolsche Variable. Einzig richtig wäre hier
Delphi-Quellcode:
IF B then...
oder
Delphi-Quellcode:
IF not B then ...

Ja, ist uns dann auch aufgefallen das ja eigentlich gar kein Sinn macht dass dann noch abzufragen. Zu 2. ok danke, dass wussten wir bisher noch nicht dass es so wie wir es gamacht haben falsch wäre.

Sherlock 8. Mai 2020 13:58

AW: Procedure während gedrückthalten eines Buttons
 
@Hobbycoder, das wollte ich auch verlinken, mußte mir nur grad nen Kaffee holen.
:dp:

Sherlock

Hobbycoder 8. Mai 2020 14:01

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von Sherlock (Beitrag 1464035)
@Hobbycoder, das wollte ich auch verlinken, mußte mir nur grad nen Kaffee holen.
:dp:

Sherlock

Endlich war ich mal schneller :-D:-D:-D:-D

Ich verstehe sowieso nicht, wie ihr das immer schafft, dass wenn ich auf Anworten klicke, bis ich meine Text dann fertig geschrieben habe, sind immer schon x neue Antworten da, die oft das gleiche aussagen wir meine.

Ihr habt bestimmt irgendwo im Ausland mehrere Leute sitzen, die für euch die Antworten schon mal vorschreiben, so dass ihr nur noch abschicken müsst. Anders kann ich mir das nicht erklären :-D:-D:-D

Sherlock 8. Mai 2020 14:06

AW: Procedure während gedrückthalten eines Buttons
 
Ich hatte eine ganz tolle und lesenswerte Abhandlung darüber geschrieben, wie man zum korrekten Event kommt, wollte posten und da informierte mich der rote Kasten, daß nicht nur die Lösung gefunden sondern auch schon kritisch begutachtet wurde... *seufz*

Aber ich finde jetzt ist F1nal auf einem guten Weg. Weiter so.

Sherlock

Alallart 9. Mai 2020 02:13

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von F1nal (Beitrag 1464021)
Ok und warum nicht?

Weil Boolean theoretisch ein Bitwert ist (True/False, Wahr/Falsch), also eigentlich 1 und 0, in der Praxis aber dafür ein Bytewert genommen wird. Warum? Weil der Bit zwar die kleinste Informationseinheit in der EDV ist, man einen Bit aber nicht speichern kann. Nicht alleine. Die kleinste Einheit man speichern kann ist das Byte. Man braucht eigentlich nur das 0 und 1, hat aber wegen des Bytes 0 und 1 bis 255.

Nochmal zum mitschreiben: FALSE ist 0, TRUE ist 1. Weil für das Boolean aber ein Byte verbraucht wird, könnte TRUE auch 2 oder 255 oder sonst was sein. Einfach alle Zahlen zwischen 1 und 255. Theoretisch.

In der Delphipraxis ist es so: FALSE ist 0, TRUE ist 1. Vergleiche ich z. B. eine Funktion in einer IF-Abfrage:
Delphi-Quellcode:
if Funktion_ABC = True then ...
muss der Boolean-Wert (der theoretisch ein Bitwert ist, aber praktisch ein Bytewert), der Funktion gleich 1 sein und von TRUE gleich 1 sein. Sind sie i.d.R. bei Delphi auch. Sind sie beide gleich 1, ist die Bedingung erfüllt.

Wo liegt also das Problem? Ganz selten kann es vorkommen, das der Boolean-Wert einer Funktion <> 1 ist. Kommt extrem selten vor, es kann aber vorkommen. Problematisch wird das eher dann, wenn man mit fremden Funktionen arbeitet, anderen Systemen, usw. Sieht die IF-Abfrage dagegen so aus:
Delphi-Quellcode:
if Funktion_ABC then ...
dann übergeht man das Problem, denn hier interpretiert Delphi alles was nicht FALSE ist als TRUE. Somit ist es egal was die Funktion liefert. Ist es nicht FALSE ist es TRUE. Bei direkten Vergleich dagegen kann es vorkommen, dass TRUE ungleich 1 ist.

himitsu 9. Mai 2020 02:58

AW: Procedure während gedrückthalten eines Buttons
 
Delphi-Quellcode:
var
  A, X: Boolean; // Pascal bzw. Delphi
  B: ByteBool;
  C: LongBool; // C++ bzw. WinAPI
begin
  A := True;
  B := True;
  C := True;
  X := Boolean(9);
  ShowMessage(Format('%d %d %d %d'#10'%.2x %.2x %.8x %.2x '#10'%s',
    [Ord(A), Ord(B), Ord(C), Ord(X),
    Byte(A), Byte(B), LongWord(C), Byte(X),
    BoolToStr(X = True, True) // if X = True then ...
  ]));
Konstanten: 0 und 1 (bzw. -1, also ein oder alle Bits)
Auswertung: =0 und <>0 (aber niemals =1)

p80286 9. Mai 2020 11:37

AW: Procedure während gedrückthalten eines Buttons
 
Es gibt APIs die einen Integer und die boolsche Repräsentation liefern. False=0 True=1,2... (Aufgabe wurde ausgeführt) True=-1,-2.... (Aufgabe wurde erledigt,Fehler ist aufgetreten)
Da kann es passieren das True<>True ist.

Gruß
K-H

Moombas 11. Mai 2020 08:15

AW: Procedure während gedrückthalten eines Buttons
 
Zitat:

Zitat von p80286 (Beitrag 1464091)
Es gibt APIs die einen Integer und die boolsche Repräsentation liefern. False=0 True=1,2... (Aufgabe wurde ausgeführt) True=-1,-2.... (Aufgabe wurde erledigt,Fehler ist aufgetreten)
Da kann es passieren das True<>True ist.

Gruß
K-H

Also bei Lazarus z.B. erhalte ich für True durchaus den Wert "-1", auch ohne das ein Fehler aufgetreten ist.

p80286 11. Mai 2020 10:28

AW: Procedure während gedrückthalten eines Buttons
 
OK noch ne Variante

Gruß
K.H


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 Uhr.

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