Komponentengröße und Position verändern
Komponentengröße und Position verändern
Hi,
ich möchte eine Komponente bei meinem Programm, wie bei Lazarus/Delphi skalieren und verschieben können. Es sollte möglichst Plattformunabhängig sein, aber ich kenne nur eine kleine Liste von Windows-Nachrichten, welche deshalb schon wegfallen. Irgendeine Idee, wie man so etwas schön hinbekommen könnte ? Am besten wäre es, wenn alle Komponenten, welche sich auf dem entsprechenden Formular befinden automatisch die Skalipunkte und die entsprechenden Möglichkeiten bekommen, da ich das Formular eh für nichts anderes benötige und es so allgemein praktischer ist.
ich möchte eine Komponente bei meinem Programm, wie bei Lazarus/Delphi skalieren und verschieben können. Es sollte möglichst Plattformunabhängig sein, aber ich kenne nur eine kleine Liste von Windows-Nachrichten, welche deshalb schon wegfallen. Irgendeine Idee, wie man so etwas schön hinbekommen könnte ? Am besten wäre es, wenn alle Komponenten, welche sich auf dem entsprechenden Formular befinden automatisch die Skalipunkte und die entsprechenden Möglichkeiten bekommen, da ich das Formular eh für nichts anderes benötige und es so allgemein praktischer ist.
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Vielleicht nur ne Idee wie man damit Umgehen kann. Ist zwar nicht 100% pro das was du willst, aber zumindest ein Einstieg, wie man zur Laufzeit was platziert und was für ein Aufwand.
In der Jedi-VCL findest du Hinweise. Und zwar unter 'jvcl\examples\JvDiagramShape\UseCaseEditor' befindet sich eine Demo. Das ganze basiert auf Informationen und Code von Jim Cooper (Artikel: Diagramming with Delphi Part 1 & 2).
Die Artikel, auch Code habe ich. Zusätzlich habe ich schon mit Lazarus was daraus gemacht. Ne PM (mit deiner E-Mail Adresse), falls du mehr dazu wissen willst.
In der Jedi-VCL findest du Hinweise. Und zwar unter 'jvcl\examples\JvDiagramShape\UseCaseEditor' befindet sich eine Demo. Das ganze basiert auf Informationen und Code von Jim Cooper (Artikel: Diagramming with Delphi Part 1 & 2).
Die Artikel, auch Code habe ich. Zusätzlich habe ich schon mit Lazarus was daraus gemacht. Ne PM (mit deiner E-Mail Adresse), falls du mehr dazu wissen willst.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Ich habe sowas in meinem Paint2 Projekt eingebaut.
Im Wesentlichen ist es "nur" zeitaufwendig.
Verschieben:
Alle Komponenten müssen die selben Mouse Ereignisse haben:
MouseDown, MouseMove, Moveup.
Bei MouseDown Merkst du dir die Aktuelle Maus Position am besten in einem TPoint(brauchst du später wenn du mehrer Komponenten verschieben möchtes)
Bei MouseMouse musst du jetzt prüfen ob die Linke Maustaste gerückt wurde, wenn ja setzte
Left und Top auf die Maus Pos.
Erstmal ohne Panels und ähnliches, weil dann musst du noch prüfen ob die Aktuelle Komponente Panel Eigenschaften hat oder nicht. Damit die die Position abziehen bzw. dazurechen kannst. Jedes Panel hat ja seine eigens Koordinaten System.
Bei MouseUp Musst du nur noch die gespeicherten werte in der TPoint Variable updaten.
Da alle erstellten Komponente auf die gleichen Mouse Ereignisse Zeigen, brauchst du keine Kolisions Erkennung zu machen !
Beim Vergrößern wird es nicht umbedingt einfacher: Weil du musst diesen Rahmen zeichnen.
und die Draq Points die du mit der Maus anfassen kannst. in meinem Projekt wahr es einfach, weil ich die die draw Funktion anpassen kannst.
Schau dir doch mal denn Soruce Code in der Lazarus IDE:
/usr/lib/lazarus_neu/designer
welche Datei das genau ist kann ich dir im Moment nicht sagen.
Wobei wenn du das ohne den Rahm machen möchtes könntest du auch prüfen wo die Maus gerade ist also auf welcher Seite sie gerade ist. ob nun links oder rechts,
Im Wesentlichen ist es "nur" zeitaufwendig.
Verschieben:
Alle Komponenten müssen die selben Mouse Ereignisse haben:
MouseDown, MouseMove, Moveup.
Bei MouseDown Merkst du dir die Aktuelle Maus Position am besten in einem TPoint(brauchst du später wenn du mehrer Komponenten verschieben möchtes)
Bei MouseMouse musst du jetzt prüfen ob die Linke Maustaste gerückt wurde, wenn ja setzte
Left und Top auf die Maus Pos.
Erstmal ohne Panels und ähnliches, weil dann musst du noch prüfen ob die Aktuelle Komponente Panel Eigenschaften hat oder nicht. Damit die die Position abziehen bzw. dazurechen kannst. Jedes Panel hat ja seine eigens Koordinaten System.
Bei MouseUp Musst du nur noch die gespeicherten werte in der TPoint Variable updaten.
Da alle erstellten Komponente auf die gleichen Mouse Ereignisse Zeigen, brauchst du keine Kolisions Erkennung zu machen !
Beim Vergrößern wird es nicht umbedingt einfacher: Weil du musst diesen Rahmen zeichnen.
und die Draq Points die du mit der Maus anfassen kannst. in meinem Projekt wahr es einfach, weil ich die die draw Funktion anpassen kannst.
Schau dir doch mal denn Soruce Code in der Lazarus IDE:
/usr/lib/lazarus_neu/designer
welche Datei das genau ist kann ich dir im Moment nicht sagen.
Wobei wenn du das ohne den Rahm machen möchtes könntest du auch prüfen wo die Maus gerade ist also auf welcher Seite sie gerade ist. ob nun links oder rechts,
MFG
Michael Springwald
Michael Springwald
Ich habe eine Idee und würde dazu gerne eure Meinung hören:
Man programmiert sich eine Containerkomponente, welche die Punkte und Linien schon enthält. Plutos Methode ist integriert um Verschiebungen von vornherein ohne spätere Fummelarbeiten zu ermöglichen. Außerdem ist AutoSize an. In den Container könnte man Komponenten aller Art reinsetzen.
Wie könnte man so etwas in der Praxis umsetzen ?
Man programmiert sich eine Containerkomponente, welche die Punkte und Linien schon enthält. Plutos Methode ist integriert um Verschiebungen von vornherein ohne spätere Fummelarbeiten zu ermöglichen. Außerdem ist AutoSize an. In den Container könnte man Komponenten aller Art reinsetzen.
Wie könnte man so etwas in der Praxis umsetzen ?
Meine Musik: spiker-music.net
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Naja, und wie möchtes du jeder einzelne Komponente vergrößern ?
z.b. der User möchte Komponente A vergrößern und B nach ein andere.
Moment mal: doch na klar, ist doch ganz einfach
du baust dir deine eigene Komponente die auf einen Panel Bassiert.
dort zeichnest du jetzt dieses Viereck rein und fertig ist.
Autosize ist egal, wichtig ist alien muss auf alclient stehen.
Beim hinzufügen musst du jetzt zu erst ein Panel erstellen.
Beim Anklicken dieses Panels solltes du ein Viereck zeichnen oder so.
besser währen zwei Panels:
1. Um die Komponente zu speichern
2. um das Verößerungs vereck zu speichern
und beim 2. musst du dafür sorgen das das 1. Panel etwas abstand hat zum zweiten wegen dem Viereck.
Ich hoffe du verstehst das wie ich mir das vorstelle.
ist aber etwas zeitaufwendig !
aber so müsste es gehen.
ach ja bei beiden Panels solltes du den rand abschalten.
z.b. der User möchte Komponente A vergrößern und B nach ein andere.
Moment mal: doch na klar, ist doch ganz einfach
du baust dir deine eigene Komponente die auf einen Panel Bassiert.
dort zeichnest du jetzt dieses Viereck rein und fertig ist.
Autosize ist egal, wichtig ist alien muss auf alclient stehen.
Beim hinzufügen musst du jetzt zu erst ein Panel erstellen.
Beim Anklicken dieses Panels solltes du ein Viereck zeichnen oder so.
besser währen zwei Panels:
1. Um die Komponente zu speichern
2. um das Verößerungs vereck zu speichern
und beim 2. musst du dafür sorgen das das 1. Panel etwas abstand hat zum zweiten wegen dem Viereck.
Ich hoffe du verstehst das wie ich mir das vorstelle.
ist aber etwas zeitaufwendig !
aber so müsste es gehen.
ach ja bei beiden Panels solltes du den rand abschalten.
MFG
Michael Springwald
Michael Springwald
pluto: Deine Methode funktioniert nicht ganz: Man kann das Objekt "anfassen", aber sobald man die Mouse bewegt verschiebt es sich abseits der Cursorposition (ein ganzes Stück weg) und das genau 1x.
Code: Alles auswählen
private
MPos : TPoint;
...
// Testweise nur bei einem Panel
procedure TfrmMain.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MPos.X := X;
MPos.Y := Y;
end;
procedure TfrmMain.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Shift = [ssLeft] then
begin
Panel1.Left := MPos.X;
Panel1.Top := MPos.Y;
end;
end;
procedure TfrmMain.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with MPos do
begin
X := frmMain.Left + Panel1.Left;
Y := frmMain.Top + Panel1.Top;
end;
end;
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
versuch mal sowas in deinem panel bei MouseMove:
if Shift = [ssLeft] then begin
Panel1.Left := Panel1.Left+1;
jetzt musst du nur noch heraus finden ob der user die Maus nach links oder rechts bewegst.
edit1:
schau dir mal die Datei:
/usr/lib/lazarus_neu/designer/controlselection.pp
an.
if Shift = [ssLeft] then begin
Panel1.Left := Panel1.Left+1;
jetzt musst du nur noch heraus finden ob der user die Maus nach links oder rechts bewegst.
edit1:
schau dir mal die Datei:
/usr/lib/lazarus_neu/designer/controlselection.pp
an.
MFG
Michael Springwald
Michael Springwald