![]() |
Ein roter Punkt den man auf dem Desktop verschieben kann
Hallo,
erstmal Hut ab vor eurer Arbeit, ich hab mir vor 2 Tagen mehrere Bücher drüber gekauft und werde mich da durcharbeiten!! Was ich aber gerne Suche ist folgendes: Ein Programm das immer im Vordergrund ist (wie TSDisp)! Es soll folgendes Darstellen: einen roten Punkt, der ungefähr 2,5 mm groß ist und in der Position auf dem Desktop verschiebbar ist!! Auf antworten oder ein kleines Programm wär ich dankbar! P.S. Ich bin ein Anfänger und würd mich freuen über eine normale Sprache! thx HappyPunk |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Hi,
erstmal herzlich willkommen in der DP! :DP: Du möchtest einen roten Punkt, der ständig im Vordergrund ist? Ok, wenn du's schön findest :wink: Ich hab dir mal die Lösung angehangen. Hier noch ein wenig Erklärung. An sich ist die Idee sehr einfach, du nimmst ein Formular (dies Hauptfenster das immer angezeigt wird). Würdest du dein Programm so starten, hast du ein leeres Fenster mit dieser Leiste oben, zum Schließen und minimieren usw. Diese Leiste möchtest du sicherlich nicht bei einem roten Punkt sehen, also schaltet man sie ab. Dazu findest du im Objektinspektor unter den Eigenschaften deines Forms BorderStyle, diese Eigenschaft änderst du auf BsNone (keine Titelleiste). Als nächstes platzierst du ein TImage auf dem Form. Das ist eine Komponente in die du zeichnen kannst. Da hier dein Kreis reingezeichnet wird, machst du das TImage einfach so groß, wie dein Kreis später sein soll und das Form drum rum so klein, dass es genau mit der Image größe übereinstimmt. Gut, du hast die Zeichenfläche, aber da ist jetzt noch kein roter Kreis drin. Macht nichts, kannst du ja zeichnen. Dazu wechselst du im Objektinspektor auf TForm1 (also dein Hauptformular) und klickst unter Ereignisse doppelt ins Feld OnCreate. Hier fügst du die Routine zum zeichnen ein:
Delphi-Quellcode:
Soweit so gut. Wenn du jetzt startest, hättest du schon mal ein weißes Rechteck, mit einem roten Kreis drin. Toll, aber du wolltest sicherlich nur den roten Punkt, ohne rotes Rechteck? Dann machen wir weiß einfach mal etwas unsichtbar.
// Zeichenfarbe (Pinsel) auf rot setzen
self.Image1.Canvas.Brush.Color := clRed; // Kreis zeichnen self.Image1.Canvas.Ellipse(0, 0, self.Width, self.Height); // DoubleBuffer aktivieren (verhindert flackern) self.DoubleBuffered := true; Dazu gehst du wieder auf deinen ObjektInspektor, auf das Form1 und suchst hier unter Eigenschaften TransparentColor. TransparentColor setzt du auf True und TransparentColorValue auf clWhite. Damit wird weiß transparent (also nicht mehr Sichtbar). Nun hast du also einen roten Kreis. Wenn du diesen bewegen möchtest (mit der Maus) musst du auf Mausereignisse reagieren. Hierzu gehst du wieder auf den Objektinspektor, diesmal wählst du jedoch das Image. Wird die Linke Maustaste gedrückt, so merkst du dir einfach, dass der Punkt bewegt wird und natürlich die Ausgangsposition. Wird die Maus bewegt, so bewegst du den Punkt mit der Maus. Dazu berechnest du einfach den Unterschied zwischen der aktuellen Mausposition und den Ausgangskoordinaten. Natürlich solltest du den Punkt auch nur bewegen, wenn die linke Maustaste gedrückt ist. Wird die linke Maustaste wieder losgelassen, so hörst du einfach mit dem Bewegen auf. Dazu klickst du nacheinander doppelt auf OnMouseDown, OnMouseMove und OnMouseUp und fügst jeweils folgenden Code ein:
Delphi-Quellcode:
Die Variablen moving : Boolean und lastX sowie lastY musst du im Form noch unter private eintragen, fertig.
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin // prüfen ob die linke Maustaste gedrückt wurde if ssLeft in Shift then begin // aktuelle Mausposition merken self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; // Modus wechseln self.moving := True; end; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // wenn Modus moving aktiv if self.moving then begin // Position des Fensters relativ zu Mauskoordinaten ändern self.Left := self.Left + (Mouse.CursorPos.X - lastX); self.Top := self.Top + (Mouse.CursorPos.Y - lastY); // Merken der neuen Position self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; end; end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Wenn Linke Maustaste losgelassen wurde if Button = mbLeft then begin // Modus moving verlassen self.moving := false; end; end; Das sollte klappen. Hoffe es wahr halbwegs verständlich. Gruß Der Unwissende |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Moin,
nur zur Info: Es ginge auch ohen ein TImage, da das Formular selbst auch ein Canvas besitzt, auf dem Du zeichnen kannst. Btw: Ich veranlasse mel eine verschiebung des Threads. |
DP-Maintenance
Dieses Thema wurde von "Daniel" von "Tools rund um Delphi" nach "Sonstige Fragen zu Delphi" verschoben.
|
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Lass mich raten, du spielst gerne Shooter? ;)
|
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Erstmal danke für die ausführliche Beschreibung!!
Ich probier des gleich mal aus!! ^^ und ja ich spiel gern shooter :lol: |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab das jetzt mal gemacht, aber wo ist mein Fehler??
P.S. ich vertsteh das min lastX Boolean und lastY nicht! Wie soll ich die auf private stellen? |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Das sind Variablen, die Delphi erst kennst, wenn du ihm das mitteilst. Um in der akt. Unit darauf zuzugreifen, deklariert man sie unter private. So:
Delphi-Quellcode:
type
TForm1 = class(TForm) Image1: TImage; procedure FormCreate(Sender: TObject); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } Moving: Boolean // <- hier LastX, LastY: Integer; // <- und hier public { Public-Deklarationen } end; |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Ich weiß net was ich falsch mach!! ich mach des so wie es hier steht und wie ich es meinen Büchern entnehmen kann:
Delphi-Quellcode:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; procedure FormCreate(Sender: TObject); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // Zeichenfarbe (Pinsel) auf rot setzen self.Image1.Canvas.Brush.Color := clRed; // Kreis zeichnen self.Image1.Canvas.Ellipse(0, 0, self.Width, self.Height); // DoubleBuffer aktivieren (verhindert flackern) self.DoubleBuffered := true; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // prüfen ob die linke Maustaste gedrückt wurde if ssLeft in Shift then begin // aktuelle Mausposition merken self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; // Modus wechseln self.moving := True; end; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // wenn Modus moving aktiv if self.moving then begin // Position des Fensters relativ zu Mauskoordinaten ändern self.Left := self.Left + (Mouse.CursorPos.X - lastX); self.Top := self.Top + (Mouse.CursorPos.Y - lastY); // Merken der neuen Position self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; end; end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Wenn Linke Maustaste losgelassen wurde if Button = mbLeft then begin // Modus moving verlassen self.moving := false; end; type TForm1 = class(TForm) Image1: TImage; procedure FormCreate(Sender: TObject); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } Moving: Boolean // <- hier LastX, LastY: Integer; // <- und hier public { Public-Deklarationen } end; end; end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin end; end. |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Du hast in der Implementation zwei mal Image1MouseUp stehen.
|
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Liste der Anhänge anzeigen (Anzahl: 1)
kann mir keiner in der Datei den Fehler suchen und den "ausbessern"!
ICh komm da leider net weiter! thx |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Wieso deklarierst du zweimal die Klasse TForm1??
Ein mal im Interface, da gehört sie auch hin, und einmal in der Implementation? Bitte mach mal
Delphi-Quellcode:
- Tags um einen Code.
und
Grüße Faux |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
so nochmal!!
ich hoffe der is besser!! :mrgreen:
Delphi-Quellcode:
unit Redpoint; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm2 = class(TForm) Image1: TImage; private LastX, LastY: Integer; public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} end. // Zeichenfarbe (Pinsel) auf rot setzen self.Image1.Canvas.Brush.Color := clRed; // Kreis zeichnen self.Image1.Canvas.Ellipse(0, 0, self.Width, self.Height); // DoubleBuffer aktivieren (verhindert flackern) self.DoubleBuffered := true; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // prüfen ob die linke Maustaste gedrückt wurde if ssLeft in Shift then begin // aktuelle Mausposition merken self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; // Modus wechseln self.moving := True; end; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // wenn Modus moving aktiv if self.moving then begin // Position des Fensters relativ zu Mauskoordinaten ändern self.Left := self.Left + (Mouse.CursorPos.X - lastX); self.Top := self.Top + (Mouse.CursorPos.Y - lastY); // Merken der neuen Position self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; end; end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Wenn Linke Maustaste losgelassen wurde if Button = mbLeft then begin // Modus moving verlassen self.moving := false; end; end; |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Ok ich frag mich zwar wie man eine Datei so zerstückeln kann, aber ist ja auch egal.
Hier hab ich sie für dich mal "richtig zusammengesetzt".
Delphi-Quellcode:
edit: Semikolon hinzugefügt. Sry kam von copy&paste
unit Redpoint;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; procedure FormCreate(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } Moving: Boolean; // <- hier LastX, LastY: Integer; // <- und hier public { Public-Deklarationen } end; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // Zeichenfarbe (Pinsel) auf rot setzen self.Image1.Canvas.Brush.Color := clRed; // Kreis zeichnen self.Image1.Canvas.Ellipse(0, 0, self.Width, self.Height); // DoubleBuffer aktivieren (verhindert flackern) self.DoubleBuffered := true; end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // prüfen ob die linke Maustaste gedrückt wurde if ssLeft in Shift then begin // aktuelle Mausposition merken self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; // Modus wechseln self.moving := True; end; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // wenn Modus moving aktiv if self.moving then begin // Position des Fensters relativ zu Mauskoordinaten ändern self.Left := self.Left + (Mouse.CursorPos.X - lastX); self.Top := self.Top + (Mouse.CursorPos.Y - lastY); // Merken der neuen Position self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; end; end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Wenn Linke Maustaste losgelassen wurde if Button = mbLeft then begin // Modus moving verlassen self.moving := false; end; end; end. |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Nur mal so ne Frage, wieso schreibst du immer self. ? Ohne ginge es genau so, da du ja in der TForm1-Klasse bist.
Grüße Faux |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
So jetzt schaut die schon besser aus!!
Aber ich hab noch ein Problem! Ich kann die Software nicht testen (F9)
Delphi-Quellcode:
unit Redpoint;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; procedure FormCreate(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } Moving: Boolean // <- hier LastX, LastY: Integer; // <- und hier public { Public-Deklarationen } end; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // Zeichenfarbe (Pinsel) auf rot setzen self.Image1.Canvas.Brush.Color := clRed; // Kreis zeichnen self.Image1.Canvas.Ellipse(0, 0, self.Width, self.Height); // DoubleBuffer aktivieren (verhindert flackern) self.DoubleBuffered := true; end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // prüfen ob die linke Maustaste gedrückt wurde if ssLeft in Shift then begin // aktuelle Mausposition merken self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; // Modus wechseln self.moving := True; end; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // wenn Modus moving aktiv if self.moving then begin // Position des Fensters relativ zu Mauskoordinaten ändern self.Left := self.Left + (Mouse.CursorPos.X - lastX); self.Top := self.Top + (Mouse.CursorPos.Y - lastY); // Merken der neuen Position self.lastX := Mouse.CursorPos.X; self.lastY := Mouse.CursorPos.Y; end; end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Wenn Linke Maustaste losgelassen wurde if Button = mbLeft then begin // Modus moving verlassen self.moving := false; end; end; end. |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Hallo!
Spezifiziere dein Problem mal. Denn so kann es an hunderten Dingen liegen:
Grüße Faux |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
@ Brainstalker,
Zitat:
muss das nicht so deklariert werden?
Delphi-Quellcode:
//Jürgen
private
{ Private-Deklarationen } Var Moving: Boolean; // <- hier LastX, LastY: Integer; // <- und hier public |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Zitat:
Aber ich sehe gerade, dass ohnehin nach Boolean ein Semikolon fehlt. Grüße Faux |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Zitat:
|
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
joah, stimmt. hab das semikilon vergessen, da ich die variable vom typ boolean erst später gesehen und ergänzt habe. das var muss da nicht hin.
|
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Zitat:
|
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Hallo Faux,
etwas OT; ich hätte gedacht -da es eine Variabledeklaration ist- muss das unter private auch mit var eingeleitet werden.... Ist das generell unterhalb von privat so? Grüße Jürgen |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Zitat:
Grüße Faux |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
@ Faux,
Danke! :-D Gruß Jürgen |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Hab das fehlende ; in meinem Beitrag hinzugefügt.
@ HappyPunk Lag es an dem fehlenden Semikolon? Was für ein Fehler tritt denn beim kompilieren auf? |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Liste der Anhänge anzeigen (Anzahl: 1)
@ HappyPunk,
hab das ganze mal im Anhang... Hinzugenommen habe ich, dass bei Doppelklick das Programm beendet wird. :wink: Schau dir bitte die Eigenschaften im OI für TImage und Form1 an, insbesondere auch die unter dem Reiter "Ereignisse"... Grüße Jürgen |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Thx für des Programm, aber ich hab ein Problem!!
Des legt sich nicht über Call of Duty!! :-) geht des anders?? greets happy |
Re: Ein roter Punkt den man auf dem Desktop verschieben kann
Hallo,
Zitat:
Gruß xaromz //Edit: Einer meiner Bekannten hat sich einfach einen roten Edding genommen... Ein roter Bindfaden über Kreuz über den Monitor gespannt könnte auch helfen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz