Komponentengröße und Position verändern

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Komponentengröße und Position verändern

Beitrag von Nils »

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.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Irgendwie versteh ich die Frage nicht ganz?

Wie wäre es mit align bzw. Anchors/Borderspacing im OI?
Johannes

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Er will einen Laufzeiteditor für seine Forms haben Monta.

Nils, das ist lange nicht so einfach wie du dir das vorstellst, geht es wirklich nicht anders ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

@Christian: ah, danke, jetzt versteh ichs auch.
Johannes

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Beitrag von Nils »

Ich muss ohne wirkliches Zeitlimit einen Formdesigner schreiben, der nur ein paar Komponenten beherschrt. Deshalb geht es leider nicht anders.
Meine Musik: spiker-music.net

Benutzeravatar
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:

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
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)

Beitrag von pluto »

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,
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Du hast das doch aber nicht mit Komponenten gemacht oder Pluto ?
Und man kann nicht auf alle Komponenten zeichnen das ist also was gänzlich anderes...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
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)

Beitrag von pluto »

Nein das habe ich nicht.
Darum habe ich auch den untern Teil geschrieben bzw. hinzugefügt.

Aber verschieben geht so.
MFG
Michael Springwald

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Beitrag von Nils »

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 ?
Meine Musik: spiker-music.net

pluto
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)

Beitrag von pluto »

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.
MFG
Michael Springwald

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Beitrag von Nils »

Thx. So werde ich es probieren.

[OT]
hren ist falsch. Das h muss weg. Wenn ich dich nicht verwechsel, dann ist deine Rechtschreibung schon vielviel besser als früher geworden. :) Weiter so!
[/OT]
Meine Musik: spiker-music.net

pluto
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)

Beitrag von pluto »

ich nutze ja auch fleißig die Rechtschreibhilfe von FF *G*.
(das habe ich in anderen Foren nie gemacht, auch wenn ich da schon "aufgefordert wurde").

kannst das Ergebnis ja mal hier posten Nils. Evlt. sogar als Tipp *G*
MFG
Michael Springwald

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Beitrag von Nils »

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;

pluto
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)

Beitrag von pluto »

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.
MFG
Michael Springwald

Antworten