Anker im Forumlardesigner - wie verwenden?

Für Fragen rund um die Ide und zum Debugger

Anker im Forumlardesigner - wie verwenden?

Beitragvon Timm Thaler » 14. Jan 2019, 23:36 Anker im Forumlardesigner - wie verwenden?

Da ich ja lernfähig bin, versuche ich Objekte auf Formularen nicht absolut zu positionieren, sondern voneinander abhängig zu machen. Damit soll auch unter Linux mit anderen (meist größeren) Buttons ein ordentliches Forumlar aufgebaut werden.

Nun meckert allerdings der Formulareditor zunehmend wegen zirkulärer Abhängigkeiten rum und weigert sich, entsprechende Anker zu setzen. Um das mal zu illustrieren:

Anker-01.png


Ich setze
- das Edit "start" abhängig vom linken und oberen Rand
- darunter die Checkbox "Zufall" linksbündig und 10 Pixel unterhalb von "start"
- darunter das Edit "amp" linksbündig und 10 Pixel unterhalb von "zufall"
usw.

Funktioniert soweit. Nun will ich die Edits beschriften. Ich setze
- das Label "Startreihe" horizontal mittig und 10 Pixel links von "start"
- die weiteren Label ebenso bezogen auf die Edits, die sie beschreiben

Das geht auch erstmal gut, aber bei weiteren Änderungen oder nach Neuladen des Projekts meldet der Editor dann zirkuläre Abhängigkeiten der Labels und platziert die Labels teilweise außerhalb des Fensters, so dass ich sie mit Abschalten der Anker und händischen Eingeben der Position zurückplatzieren muss.

Ich sehe auch nicht, wo die zirkulären Abhängigkeiten auftreten, denn die Position der Labels selbst wird wiederum nirgends für andere Objekte verwendet.

Wie gehe ich am besten bei der Festlegung der Anker vor, um solche Abhängigkeiten zu vermeiden?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Timm Thaler
 
Beiträge: 874
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon fliegermichl » 15. Jan 2019, 05:02 Re: Anker im Forumlardesigner - wie verwenden?

Das wüsste ich auch gerne.
Den Ankereditor von Lazarus hab ich noch nie kapiert.
fliegermichl
 
Beiträge: 289
Registriert: 9. Jun 2011, 08:42

Beitragvon Michl » 15. Jan 2019, 09:11 Re: Anker im Forumlardesigner - wie verwenden?

Obwohl ich eigentlich sehr viel händisch mache (also zur Laufzeit), ist der Ankereditor eines der wenigen WYSIWYG Tools, die ich in der IDE tatsächlich nutze. Dabei habe ich eigentlich keine Probleme mit zirkulären Abhängigkeiten. Eine einfache Regel an die ich mich halte ist z.B. immer von oben links und unten rechts aus verankern. Bei den TLabels suche ich mir zur Laufzeit das längste, an dem ich benachbarte Komponenten ausrichte (damit kein unnötiger Platz zwischen einem TLabel und TEdit ist und trotzdem alle untereinander stehen).

Bei deinem Beispiel ist ungünstig, daß du die TEdits sicherlich untereinander, gleich groß und formularfüllend haben möchtest, aber nicht immer zwei davon da sind. Wenn immer zwei da wären, würde ich ein TPanel nehmen und jeweils die zwei TEdits mittels Childsizing automatisch platzieren lassen. So wirst du die Breite eines TEdits zur Laufzeit kurz berechnen müssen:

Code: Alles auswählen
function LongestLabel(Labels: array of TLabel): TLabel;
var
  ALabel: TLabel;
  AWidth, ResultWidth: Integer;
begin
  Result := nil;
  ResultWidth := -1;
  for ALabel in Labels do
    if Assigned(ALabel) then begin
      AWidth := ALabel.Canvas.TextWidth(ALabel.Caption);
      if not Assigned(Result) or (AWidth > ResultWidth) then begin
        ResultWidth := AWidth;
        Result := ALabel;
      end;
    end;
end;
 
procedure TForm1.FormResize(Sender: TObject);
var
  ALabel: TLabel;
  AWidth: Integer;
begin
  ALabel := LongestLabel([Label1, Label2, Label3, Label4, Label5]);
  Edit1.AnchorSide[akLeft].Control := ALabel;
  AWidth := ClientWidth
            - 10 // left label space
            - ALabel.Width // longest label
            - 10 // left first edit space
            - 10 // left second edit space
            - 10; // right second edit space;
  AWidth := AWidth div 2;
  Edit1.Width := AWidth;
end

Hab mir mal die Mühe gemacht und das Bsp von dir angefügt.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

• Themenende •

Zurück zu Benutzung der IDE



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried