Lazarus beliebige Labels verschieben [gelöst]

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Lazarus beliebige Labels verschieben [gelöst]

Beitrag von Dragomir »

hallo erstmal

hätte da ne kleine Frage ich habe ein Programm indem ich Labels erstelle ihnen nahmen gebe z.B Label[1], Label[2] und soweiter
mein Problem ist jetz wenn ich das Panel erweitern will will ich dass sie sich auch verrücken aber sie bleiben auf der gleichen stelle


ein Label zu verschieben ist ja nicht schwer aber wie bekomme ich es hin in einer schleife 1 Label nach dem anderen zu verschieben da ich ja beliebig viele Label erstellen kann und somit weiss ich nicht wie viele Label der User errichten will
schonmal danke im vorraus

:mrgreen: :mrgreen:
Zuletzt geändert von Dragomir am Di 5. Mai 2015, 15:48, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus beliebige Labels verschieben

Beitrag von theo »

Hallo

Erstellst du die Labels im Code oder im Formular Designer?

Und warum schreiben alle "im voraus" mit zwei "r"?
Da möchte ich wirklich mal verstehen woher das kommt.

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Lazarus beliebige Labels verschieben

Beitrag von Dragomir »

Erstmal zu dem Voraus danke werde ich mir merken :)

ehm ich erstelle sie im Code habe auch schon ein Ansatz bekommen nämlich

Code: Alles auswählen

 
while iZaehler > 0 do
        begin
          TLabel('L_Text' + inttostr(iZaehler)).Left :=  50;
          iZaehler := iZaehler - 1;
        end;   



nur bekomme ich jetz beim durchlaufen den Fehler

In Zeile 3929


Code: Alles auswählen

procedure TControl.SetLeft(Value: Integer);
begin
  {$IFDEF CHECK_POSITION}
  if CheckPosition(Self) then
  DebugLn('[TControl.SetLeft] ',Name,':',ClassName,' ',DbgS(Value));
  {$ENDIF}
  if csLoading in ComponentState then
  begin
    inc(FReadBounds.Right, Value - FReadBounds.Left);
    FReadBounds.Left := Value;
    Include(FControlFlags, cfLeftLoaded);
  end;
 [color=#FF0000] SetBounds(Value, FTop, FWidth, FHeight);[/color]
end;
 

und danke für die schnelle Antwort
Zuletzt geändert von Lori am Di 28. Apr 2015, 19:24, insgesamt 1-mal geändert.
Grund: Highlighter

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Lazarus beliebige Labels verschieben

Beitrag von Dragomir »

ok habs raus falls das noch jemand sucht hier die lösung

Code: Alles auswählen

    begin
      iZaehler := iCounter;
      while iZaehler > 0 do
        begin
          TLabel(FindComponent('L_Text' + inttostr(iZaehler))).top :=
                TLabel(FindComponent('L_Text' + inttostr(iZaehler))).top + 50;
          iZaehler := iZaehler - 1;
        end;
Zuletzt geändert von Lori am Di 28. Apr 2015, 19:24, insgesamt 1-mal geändert.
Grund: Highlighter

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Lazarus beliebige Labels verschieben

Beitrag von Warf »

Ich möchte jetzt nicht ultra kleinkariert sein, allerdings würde ich dir gerne ein Paar Verbesserungen vorschlagen.
Zunächst mal wäre es schlauer für deine Labels einen Array oder Liste zu nehmen (TObjectList aus der contnrs Unit), damit hast du alle Labels in einer Liste gespeichert. Die Speicherauslastung wäre nur minimal Höher (Labelanzahl * SizeOf(Pointer) + die Größe der TObjectList (glaube 24 Byte)) und vor allem FindComponent benötigt mehrere unnötige Schleifendurchläufe(worst Case die Anzahl aller in der Form Registrierten Componenten) und das ganze 2 mal, dann ruft das noch die CompareString Funktion auf, welche auch noch mal einige Schleifendurchläufe durchführt. Außerdem bekommst du einen Fehler, wenn eines der Objekte nicht exsistiert wie es soll, und wenn du vorhast die Labels auf mehrere Parents zu verteilen geht das so sowiso schief.

Außerdem könntest du deinen Code mit einer For-Schleife und C Artigen Operatoren noch ein gutes Stück verkürzen:

Code: Alles auswählen

 
for iZaehler:=iCount downto 1 do
  TLabel(FindComponent('L_Text' + inttostr(iZaehler))).top += 50;


Sind nur gut gemeinte Ratschläge :D

Und warum schreiben alle "im voraus" mit zwei "r"?
Da möchte ich wirklich mal verstehen woher das kommt.

Ziemlich simpel, wenn man dieses Wort nicht so oft schreibt, und die Rechtschreibung davon noch nicht automatisiert, denkt man sich wie man es schreiben würde, und da denkt man sich wohl, das ist eine verknüpfung aus vor und raus, also vorraus

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Lazarus beliebige Labels verschieben

Beitrag von Dragomir »

Warf ganz und garnicht kleinkariert wenn man es nicht kennt woher sollte man wissen das es so funktioniert also erstmal ein dickes danke :)
gut werde es mir dann so vornehmen
vielen vielen dank :mrgreen: :mrgreen:

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Lazarus beliebige Labels verschieben

Beitrag von Mathias »

mein Problem ist jetz wenn ich das Panel erweitern will will ich dass sie sich auch verrücken aber sie bleiben auf der gleichen stelle


Code: Alles auswählen

  Label1.Anchors := [akRight, akBottom];


Vielleicht hilft dir sogar diese einfache Zeile weiter.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Lazarus beliebige Labels verschieben

Beitrag von Dragomir »

Danke probiere ich morgen aus :)

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Lazarus beliebige Labels verschieben

Beitrag von Dragomir »

Funktioniert auch danke für die vielen und vorallem schnellen antworten :)

Antworten