Entwickler-Ecke

Sonstiges (Delphi) - Farbe des Zeichenstiftes ändern


Chryzler - So 13.05.07 15:45
Titel: Farbe des Zeichenstiftes ändern
Hi,

user profile iconSummerjam hat folgendes Problem:
Zitat:
ich programmier paint nach..n der mausmove procedure hab ich im gesagt das er die gummilinien grau malen soll
nun soll er aber danach in der mausup porcedure wieder in anderen farben malen
das amcht er aber net


Hat jemand ne Lösung für dieses Problem?

EDIT: Summerjam, könntest du hier bitte deinen gesamten Quelltext posten, ansonsten wirds sehr schwierig werden, dir zu helfen.


jakobwenzel - So 13.05.07 15:54

Ich würd sagen, dass er des net macht, weil du das nicht so programmiert hast. Im Mouseup einfach wieder die Farbe setzen...


Summerjam - So 13.05.07 15:59
Titel: .
udn wie geht das??


Chryzler - So 13.05.07 16:02
Titel: Re: Farbe des Zeichenstiftes ändern
user profile iconChryzler hat folgendes geschrieben:
Summerjam, könntest du hier bitte deinen gesamten Quelltext posten, ansonsten wirds sehr schwierig werden, dir zu helfen.


jakobwenzel - So 13.05.07 16:04

Du hasts doch anscheinend schonmal geschafft, die Farbe zu ändern. Da wirst du es doch nochmal schaffen!


JayEff - So 13.05.07 16:07

Er hat vorher erst mehrfach beschrieben, dass er mit den Nerven am Ende ist, und das kann ich ihm gut nach empfinden, hatte ich doch selbst ab und zu solche Situationen :autsch:
Summerjam, wie schon gesagt wurde, bitte gib uns erstmal größere Abschnitte von deinem Quelltext. Bitte schließe ihn gleich so: <span class="inlineSyntax"><span class="codecomment">{PROTECTTAG0250c4b66122700e608682c213068aec}</span></span> mit in Delphi-Tags ein.
Ich bin sicher, wir werden in weniger als einer halben Stunde eine Lösung für dich parat haben ;)


Summerjam - So 13.05.07 16:23
Titel: geht net anders
also das ist mein quelltext...

soo.

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:
procedure TPaint.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Mausgedrueckt:=true;
 Xanfang:=X;
Yanfang:=Y;
Xende:=X;
Yende:=Y;
Canvas.MoveTo (Xanfang, Yanfang)
end;


procedure TPaint.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if Mausgedrueckt=true
      then
   if  BitBTnFrei.Enabled=false
  then Canvas.LineTo(X,Y)
      else
  if BitBtnLinie.Enabled=false
       then
 begin
Canvas.Pen.Mode:= pmNotXor;
Canvas.MoveTo(Xanfang, Yanfang);
 Canvas.LineTo(Xende, Yende);
 Canvas.MoveTo(Xanfang, Yanfang);
 Canvas.LineTo(X,Y);
Xende:=X;
 Yende:=Y;
end
 else
  begin
 if BitBtnRechteck.Enabled=false then
  begin
Canvas.Pen.Mode:= pmnotxor;
 Canvas.MoveTo(Xanfang,Yanfang);
 Canvas.Rectangle(Xanfang,Yanfang,Xende,YEnde);
  canvas.MoveTo(XAnfang,YAnfang);
Canvas.Rectangle(x,y,XAnfang,YAnfang);
 XEnde:= X;
YEnde:= Y;
end
else
 if BitBtnEllipse.Enabled=false
then begin
Canvas.Pen.Mode:= pmnotxor;
 Canvas.moveTo(Xanfang,Yanfang);
 Canvas.Ellipse(Xanfang,Yanfang,Xende,YEnde);
  canvas.MoveTo(XAnfang,YAnfang);
 Canvas.Ellipse(x,y,XAnfang,YAnfang);
  XEnde:= X;
   YEnde:= Y;
     end
  else if Radiergummi.Enabled=false then
    Canvas.Pen.Color:=clWhite
   end
  end;


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Beiträge zusammengefasst


JayEff - So 13.05.07 16:29

user profile iconJayEff hat folgendes geschrieben:
Bitte schließe ihn gleich so: <span class="inlineSyntax"><span class="codecomment">{PROTECTTAG325c31f0e0126a2d1e861e37051ecec7}</span></span> mit in Delphi-Tags ein.
Bitte ändere das doch einfach, in dem du die user defined image-Taste (bzw. für den Inline-Editor, falls im Profil AJAX aktiviert ist, die user defined image-Taste) rechts oben neben deinem Beitrag benutzt.
Ausserdem: Wir versuchen ein bisschen Übersicht zu waren, darum bitte keine Doppelposts, sondern den Edit-Button benutzen ;) Auch wenn das ein Moderator sicher gleich für dich zusammen fasst ;)

Der Text ist so etwas unleserlich, darum kann ich auch grad nicht direkt einen Fehler erkennen ... Ich vermute aber, dass du mit den if-then-else Abfragen etwas falsch gemacht hast.


Summerjam - So 13.05.07 16:32
Titel: .
wie soll ich das den sonst machen?


JayEff - So 13.05.07 16:40

Ich habs mal mit dem Delphi-SourceFormatter (Zu finden unter Suche bei Google DELFOREXP ) formatiert:

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:
    If Mausgedrueckt = true Then
        If BitBTnFrei.Enabled = false Then
            Canvas.LineTo(X, Y)
        Else If BitBtnLinie.Enabled = false Then
        Begin
            Canvas.Pen.Mode := pmNotXor;
            Canvas.MoveTo(Xanfang, Yanfang);
            Canvas.LineTo(Xende, Yende);
            Canvas.MoveTo(Xanfang, Yanfang);
            Canvas.LineTo(X, Y);
            Xende := X;
            Yende := Y;
        End
        Else
        Begin //<--
            If BitBtnRechteck.Enabled = false Then
            Begin
                Canvas.Pen.Mode := pmnotxor;
                Canvas.MoveTo(Xanfang, Yanfang);
                Canvas.Rectangle(Xanfang, Yanfang, Xende, YEnde);
                canvas.MoveTo(XAnfang, YAnfang);
                Canvas.Rectangle(x, y, XAnfang, YAnfang);
                XEnde := X;
                YEnde := Y;
            End
            Else If BitBtnEllipse.Enabled = false Then
            Begin
                Canvas.Pen.Mode := pmnotxor;
                Canvas.moveTo(Xanfang, Yanfang);
                Canvas.Ellipse(Xanfang, Yanfang, Xende, YEnde);
                canvas.MoveTo(XAnfang, YAnfang);
                Canvas.Ellipse(x, y, XAnfang, YAnfang);
                XEnde := X;
                YEnde := Y;
            End
            Else If Radiergummi.Enabled = false Then
                Canvas.Pen.Color := clWhite
        End;

Ich würde sagen, dass da einige Codeteile in den falschen Elses drin sind bzw. zu wenig Ends eingebaut wurden... :gruebel:

Edit: Lade bitte mal dein ganzes Projekt als zip datei hoch. Das müsste ganz einfach per Anhang an deinen Post gehen...


Summerjam - So 13.05.07 16:42
Titel: ,
hmm. ja ich kannd as net so beurteilen...


Chryzler - So 13.05.07 16:43

Und ich war wieder so dumm und hab den Source von Hand formattiert. Da kann einiges nicht stimmen:

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:
procedure TPaint.FormMouseDown(Sender: TObject; Button: TMouseButton; 
Shift: TShiftState; X, Y: Integer); 
begin 
  Mausgedrueckt := true; 
  Xanfang := X; 
  Yanfang := Y; 
  Xende := X; 
  Yende := Y; 
  Canvas.MoveTo(Xanfang, Yanfang); 
end


procedure TPaint.FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
Y: Integer); 
begin 
  if Mausgedrueckt = true then 
    if BitBTnFrei.Enabled = false then 
      Canvas.LineTo(X,Y) 
    else 
      if BitBtnLinie.Enabled = false then 
      begin 
        Canvas.Pen.Mode:= pmNotXor; 
        Canvas.MoveTo(Xanfang, Yanfang); 
        Canvas.LineTo(Xende, Yende); 
        Canvas.MoveTo(Xanfang, Yanfang); 
        Canvas.LineTo(X,Y); 
        Xende := X; 
        Yende := Y; 
      end 
      else 
      begin 
        if BitBtnRechteck.Enabled = false then 
        begin 
        Canvas.Pen.Mode:= pmnotxor; 
        Canvas.MoveTo(Xanfang,Yanfang); 
        Canvas.Rectangle(Xanfang,Yanfang,Xende,YEnde); 
        Canvas.MoveTo(XAnfang,YAnfang); 
        Canvas.Rectangle(x,y,XAnfang,YAnfang); 
        XEnde := X; 
        YEnde := Y; 
      end
  else // <- else? zu welchem if denn???
    if BitBtnEllipse.Enabled = false then
    begin
      Canvas.Pen.Mode:= pmnotxor; 
      Canvas.moveTo(Xanfang,Yanfang); 
      Canvas.Ellipse(Xanfang,Yanfang,Xende,YEnde); 
      Canvas.MoveTo(XAnfang,YAnfang); 
      Canvas.Ellipse(x,y,XAnfang,YAnfang); 
      XEnde := X; 
      YEnde := Y; 
    end 
    else 
      if Radiergummi.Enabled = false then 
        Canvas.Pen.Color := clWhite; 
  end // <- end? zu welchem begin???
end;


JayEff - So 13.05.07 16:45

Drum hab ich sie (sry wegen "er" :oops: ) auch gebeten, das Projekt an zuhängen. Ich glaub, ohne kommen wir nicht wirklich weiter. Ich glaube aber, dass da ein Begin zu viel ist. Ich markiere das, welches ich meine, mal in meinem vorigen Post...


Summerjam - So 13.05.07 17:00

okay wir machen das jetzt anders... aknn jemand in diesem programm die funktion frei zeichenn einsetzen udn das er beim zeihen der klinie die noch grau malt?


Chryzler - So 13.05.07 17:12

Wie wäre es, wenn du versuchst die Funktionen selbst zu schreiben, und wenn du ein Problem hast und einen Tipp brauchst, helfen wir dir gerne weiter.


Summerjam - So 13.05.07 17:12
Titel: .
und könnt ihr das?


JayEff - So 13.05.07 17:13

Das ... hast du nicht selbst geschrieben, oder? :shock: Nicht schlecht, das.
Also normalerweise liefern dir die Wenigsten hier fertigen Quelltext, einfach, weil wir wollen, dass du selbst etwas lernst.
Normalerweise läuft das, wie Chryzler geschrieben hat: Du versuchst es, und wenns nicht klappt, versuchen wir raus zufinden, was du falsch gemacht hast ;)
Blöd nur, dass ich jetzt erstmal eine Weile weg muss :( Aber wir haben hier sehr viele kompetente Menschen, die dir sicher helfen werden ;)


Summerjam - So 13.05.07 17:16

das könnt ihr mir jetzt net antun..ich habs versucht..ich weiß net wie das geht.. wie sagt man delphi das man frei amlen mlöchte...bitte helft mir..ich verzweifle


Chryzler - So 13.05.07 17:23

user profile iconJayEff hat folgendes geschrieben:
Das ... hast du nicht selbst geschrieben, oder? :shock: Nicht schlecht, das.

Das glaube ich eher weniger. Graphex ist ein Beispielprogramm von Borland (BDS\3.0\Demos\DelphiWin32\VCLWin32\Doc\Graphex). :rofl:
user profile iconSummerjam hat folgendes geschrieben:
das könnt ihr mir jetzt net antun..ich habs versucht..ich weiß net wie das geht.. wie sagt man delphi das man frei amlen mlöchte...bitte helft mir..ich verzweifle

Kannst du dich nicht einmal konkret ausdrücken? Sag, was genau dein Programm machen soll, dann sehen wir weiter.


Summerjam - So 13.05.07 17:26

in dem programm soll sämtliche dateien wie bei paint vorhanden sein.. also man muss frei zeichen könne, rechtecke, linien und kriese zeichen, farbe ausswaählen und gefüllt nicht gefüllt flächen haben..mir fehlt jetzt die das frei zeichen.. udn das wenn er die linine zieht das die dann garu werden.. und nein ich ahbe es net geschreiben..hat ein freudngeschrieben der auch hier im forum ist aber jetzt im urlaub


Chryzler - So 13.05.07 17:33

user profile iconSummerjam hat folgendes geschrieben:
in dem programm soll sämtliche dateien wie bei paint vorhanden sein.. also man muss frei zeichen könne, rechtecke, linien und kriese zeichen, farbe ausswaählen und gefüllt nicht gefüllt flächen haben..mir fehlt jetzt die das frei zeichen.. udn das wenn er die linine zieht das die dann garu werden.. und nein ich ahbe es net geschreiben..hat ein freudngeschrieben der auch hier im forum ist aber jetzt im urlaub

Frei zeichnen ist eigentlich ganz einfach:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TPaint.FormMouseDown(Sender: TObject; Button: TMouseButton;   
Shift: TShiftState; X, Y: Integer);   
begin   
  Canvas.MoveTo(X, Y);   
end;   

procedure TPaint.FormMouseMove(Sender: TObject; Shift: TShiftState; X,   
Y: Integer);   
begin   
  if ssLeft in Shift then  // wenn linke Maustaste gedrückt ist
    Canvas.LineTo(X, Y);
end;

Sollte funktionieren.

user profile iconSummerjam hat folgendes geschrieben:
und nein ich ahbe es net geschreiben..hat ein freudngeschrieben der auch hier im forum ist aber jetzt im urlaub

user profile iconChryzler hat folgendes geschrieben:
Graphex ist ein Beispielprogramm von Borland (BDS\3.0\Demos\DelphiWin32\VCLWin32\Doc\Graphex
:roll:


Summerjam - So 13.05.07 17:42
Titel: .
ja udn deswegen kriegt der noch mal bescheid...

ähmm.ja weiß jemadn den noch wie das mit dem grau geht während des zeichnens

Moderiert von user profile iconUGrohne: Beleidigung entfernt und Beiträge zusammengefasst.


Marco D. - So 13.05.07 19:17

Schaust du mal, was Chryzler gepostet hat? :roll:
Außerdem: Hat dein "Frei zeichnen" was mit "die Linie ziehen" zu tun? Ich habe immer noch nicht verstanden, was genau erreicht werden soll.


Summerjam - Mo 14.05.07 08:13
Titel: .
nein das freizeichen hat nichts mit dem linien ziehen zu tun. Wenn man ein rechteck zieht oder eine linie oder eine Ellipse soll es beim zeichen grau gekenntzeichnet sein und wenn man nicht mehr auf die maus drückt in der gewünschten Frabe erscheinen.


Chryzler - Mo 14.05.07 14:39
Titel: Re: .
user profile iconSummerjam hat folgendes geschrieben:
nein das freizeichen hat nichts mit dem linien ziehen zu tun. Wenn man ein rechteck zieht oder eine linie oder eine Ellipse soll es beim zeichen grau gekenntzeichnet sein und wenn man nicht mehr auf die maus drückt in der gewünschten Frabe erscheinen.

Achso.
Nun, da bleibt dir nichts anderes übrig, als wenn die Maustaste wieder losgelassen wird, das Rechteck oder die Linie nocheinmal mit schwarz drübermalen.
Also sobald die Maustaste gedrückt wird musst du die Farbe auf Grau setzen und eben das Rechteck zeichnen. Wenn die Maustaste losgelassen wird, musst du nochmal das selbe Rechteck zeichnen, diesmal jedoch mit Schwarz. D.h. du musst dir die X- und Y-Koordinaten intern merken (hast du ja glaub ich bereits in xstart und ystart).


Marco D. - Mo 14.05.07 15:14

user profile iconChryzler hat folgendes geschrieben:
[
Nun, da bleibt dir nichts anderes übrig, als wenn die Maustaste wieder losgelassen wird, das Rechteck oder die Linie nocheinmal mit schwarz drübermalen.
Also sobald die Maustaste gedrückt wird musst du die Farbe auf Grau setzen und eben das Rechteck zeichnen. Wenn die Maustaste losgelassen wird, musst du nochmal das selbe Rechteck zeichnen, diesmal jedoch mit Schwarz. D.h. du musst dir die X- und Y-Koordinaten intern merken (hast du ja glaub ich bereits in xstart und ystart).

Grundsätzlich richtig. Aber:
Was ist, wenn man das Rechteck erst zu groß wählt und die Maus dann wieder quasi zurück bewegt?
Ich selber weiß nicht wirklich, wie man so etwas umsetzt.


ZeitGeist87 - Mo 14.05.07 15:38

also is ganz einfach:

2 Privat-Variablen deklarieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
private
 myRect: TRect;
 Farbe: TColor;
public
 ...


Über den Farbeauswahldialog, weißt du einfach über Farbe:= Farbbox.color die gewünschte Farbe zu.

Im OnMouseDown-Ereignis setzt du über Image.Pen.Color:= clSilver die Farbe deines Zeichenstiftes auf Silber/Grau.

Am Schluss in der OnMouseMove-Prozedure deklarierst du folgendes:


Delphi-Quelltext
1:
2:
3:
4:
myRect.Topleft.x:= TopLeft.x;
myRect.Topleft.y:= TopLeft.y;
myRect.BottomRight.x:= BottomRight.x;
myRect.BottomRight.y:= BottomRight.y;


Dann gibts da ne Drawing-Prozedure

Da baust du einen Case auf drawingtool ein:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 //Farbe zuweisen, in der gezeichnet werden soll
 Image.Canvas.Pen.Color:= Farbe;

 //Case
 case drawingtool of
  dtRectangle: Image.Canvas.Rectangle(myRect);
  dtEllipse: Image.Canvas.Ellipse(myRect);
  dtRoundedRect: Image.Canvas.RoundedRect(x1, y1, x2, y2, x3, y3); //Schau da in der Hilfe nach
 end//of case


LG
Stefan

PS Das eine *reck*ack hab ich gelesen