Entwickler-Ecke

Sonstiges (Delphi) - Was ist falsch? minipaint zeichnet nicht....


Ulf22 - Do 24.03.11 10:31
Titel: Was ist falsch? minipaint zeichnet nicht....

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ColorGrd;

type
  TPaint = class(TForm)
    BitBtnfrei: TBitBtn;
    BitBtnpunkt: TBitBtn;
    ImBild: TImage;
    procedure BitBtnfreiClick(Sender: TObject);
    procedure BitBtnpunktClick(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: integer);
    procedure FormMouseUp (Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: integer);
    procedure FormMouseMove (Sender: TObject; Shift :TShiftState;
        X, Y: integer);

  private
    { Private declarations }
    MausGedrueckt: boolean;
  public
    { Public declarations }

    X1 : integer;
    X2 : integer;
    Y1 : integer;
    Y2 : integer;
  end;

var
  Paint: TPaint;

implementation

{$R *.dfm}




procedure TPaint.BitBtnfreiClick(Sender: TObject);
begin
        BitBtnfrei.Enabled := False;
        BitBtnPunkt.Enabled := True;
end;



procedure TPaint.BitBtnpunktClick(Sender: TObject);
begin
        BitBtnpunkt.Enabled := False;
        BitBtnFrei.Enabled := True;
end;

procedure Tpaint.FormMouseDown(Sender: TObject; Button:
                 TMouseButton; Shift: TShiftState; X, Y: integer);
begin

        MausGedrueckt := True ;
        Canvas.MoveTo(x,y) ;
        X1:= Canvas.PenPos.X;
        Y1:= Canvas.PenPos.Y;
        X2:= Canvas.PenPos.X;
        Y2:= Canvas.PenPos.Y;
end;

procedure Tpaint.FormMouseMove (Sender: TObject; Shift:
                               TShiftState; X, Y: integer);
begin
        if MausGedrueckt = True
                then
                begin Canvas.LineTo (X,Y);
                end
end;

procedure TPaint.FormMouseUp (Sender: TObject; Button:
                TMouseButton; Shift: TShiftState; X, Y: integer);
begin
        MausGedrueckt := False
end;



end.


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


Gausi - Do 24.03.11 10:47

Hallo und :welcome: in der Entwickler-Ecke,

zuersteinmal lässt sich das

Delphi-Quelltext
1:
2:
3:
4:
if MausGedrueckt = True
                then
                begin Canvas.LineTo (X,Y);
                end

eleganter über

Delphi-Quelltext
1:
2:
 if ssleft in Shift then
    Canvas.Lineto(x,y);

lösen. Denn ob (und welche) Maustaste beim OnMouseMove gedrückt ist, steht im Parameter Shift drin. Da muss man nicht die zusätzliche Variable einführen. Außerdem sollte man nie auf "MausGedrueckt = True" testen. Besser ist nur "if MausGedrueckt then".

Zu dem Problem: Ich tippe darauf, dass einfach mit einer ungünstigen Farbe gezeichnet wird. Probier mal etwas wie Canvas.Pen.Color := clBlack; :)


Ulf22 - Do 24.03.11 11:00

Funktioniert leider immer noch nicht...
Woran könnte es noch liegen?


Gausi - Do 24.03.11 11:23

Du hast da auch ein Image auf der Form. Möchtest du auf dem Image zeichnen, oder auf der Form selbst? So, wie es jetzt ist, zeichnest du nämlich direkt auf der Form. Und das auch nur, wenn du mit der Maus dich auf der Form direkt bewegst, nicht auf dem Image.


FrEaKY - Do 24.03.11 18:03

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem sollte man nie auf "MausGedrueckt = True" testen. Besser ist nur "if MausGedrueckt then".

Darf ich fragen warum, Gausi? Ich hab hier schonmal gelesen, dass ein deutlicher Unterschied besteht zwischen "if boolean then" und "if boolean=true then".
Bei "if boolean then" wird glaube ich nur gefragt "ist boolean <> 0" und bei "if boolean=true" natürlich "ist boolean = 1".
Seitdem packe ich immer mindestens entweder ein TRUE oder FALSE rein.


jaenicke - Do 24.03.11 19:24

user profile iconFrEaKY hat folgendes geschrieben Zum zitierten Posting springen:
Bei "if boolean then" wird glaube ich nur gefragt "ist boolean <> 0" und bei "if boolean=true" natürlich "ist boolean = 1".
Eben, und deshalb funktioniert der Vergleich mit True nicht immer und ist daher nicht nur unschön und unlogisch, sondern falsch.
Hier habe ich mal ein kleines Beispiel gebastelt, wann es schief geht:
http://www.delphi-forum.de/viewtopic.php?p=548760#548760
Mehr dazu steht hier unter Anfängerfehler:
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/typische-anfaengerfehler/
Und warum das auch vollkommen unlogisch ist:
http://www.delphi-forum.de/viewtopic.php?p=560637#560637


FrEaKY - Fr 25.03.11 00:56

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconFrEaKY hat folgendes geschrieben Zum zitierten Posting springen:
Bei "if boolean then" wird glaube ich nur gefragt "ist boolean <> 0" und bei "if boolean=true" natürlich "ist boolean = 1".
Eben, und deshalb funktioniert der Vergleich mit True nicht immer und ist daher nicht nur unschön und unlogisch, sondern falsch.
Hier habe ich mal ein kleines Beispiel gebastelt, wann es schief geht:
http://www.delphi-forum.de/viewtopic.php?p=548760#548760
Mehr dazu steht hier unter Anfängerfehler:
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/typische-anfaengerfehler/
Und warum das auch vollkommen unlogisch ist:
http://www.delphi-forum.de/viewtopic.php?p=560637#560637

Aha! Dann hab ichs mir genau falsch gemerkt :roll:
Danke für die Erklärung!