Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Label korrekt zur Laufzeit erzeugen? (https://www.delphipraxis.net/173119-label-korrekt-zur-laufzeit-erzeugen.html)

AlexII 7. Feb 2013 21:10

Delphi-Version: 2010

Label korrekt zur Laufzeit erzeugen?
 
Hallo,

hab hier ein kleines Problem.
Wenn der Autor in der DB vorhanden ist und die Labelkomponente noch nicht existiert - wird diese erzeugt und der Name des Autors angezeigt. Klicke ich dann ein anderes Datensatz an, wo auch der Name vorhanden ist, wird dieser nicht mehr ausgegeben, der vorheriger Name des Autors bleibt für immer stehen. Mediatitle wird hingegen immer entsprechen angezeigt, also richtig. Was mache ich falsch?

Danke!

Delphi-Quellcode:
       DetailsTitleLabel.Caption := tb.FieldAsString(tb.FieldIndex['mediatitle']);

        if tb.FieldAsString(tb.FieldIndex['aname']) <> '' then
        begin
          if TLabel(FindComponent('test1')) = nil then
          begin
            MyLabel := TLabel.Create(Self);
            MyLabel.Parent := MediaGroupBox;
            MyLabel.Name := 'test1';
            MyLabel.WordWrap := True;
            MyLabel.Caption := tb.FieldAsString(tb.FieldIndex['aname']);
            MyLabel.Left := 8;
            MyLabel.Top := 178;
            MyLabel.Font.Style:=[fsItalic];
            MyLabel.Width := MediaGroupBox.Width - 15;
          end;

          MyLabel.Caption := tb.FieldAsString(tb.FieldIndex['aname']);
       end;

Bummi 7. Feb 2013 21:42

AW: Label korrekt zur Laufzeit erzeugen?
 
Du hast keinen else Zweig für

if TLabel(FindComponent('test1')) = nil then

in dem MyLabel gesetzt würde.

AlexII 7. Feb 2013 21:49

AW: Label korrekt zur Laufzeit erzeugen?
 
Das ist doch dasselbe... hab's auch mit else versucht, und das bringt leider nichts.

Sir Rufo 7. Feb 2013 21:49

AW: Label korrekt zur Laufzeit erzeugen?
 
Zitat:

Zitat von Bummi (Beitrag 1202502)
Du hast keinen else Zweig für

Delphi-Quellcode:
if TLabel(FindComponent('test1')) = nil then
in dem MyLabel gesetzt würde.

Der
Delphi-Quellcode:
else
Zweig ist ja auch überflüssig ... allerdings ist
Delphi-Quellcode:
MyLabel
entweder
Delphi-Quellcode:
nil
oder sogar undefiniert, wenn schon ein Label besteht und dann soll darauf zugegriffen werden ;)

Besser so:
Delphi-Quellcode:
       DetailsTitleLabel.Caption := tb.FieldAsString( tb.FieldIndex['mediatitle'] );

        if tb.FieldAsString( tb.FieldIndex['aname'] ) <> '' then
        begin
          // Label suchen
          MyLabel := TLabel( FindComponent( 'test1' ) );

          // Wenn kein Label gefunden wurde
          if MyLabel = nil then
          begin
            // dann müssen wir uns einen anlegen
            MyLabel := TLabel.Create( Self );
            MyLabel.Parent := MediaGroupBox;
            MyLabel.Name := 'test1';
            MyLabel.WordWrap := True;
            // MyLabel.Caption := tb.FieldAsString( tb.FieldIndex['aname'] );
            MyLabel.Left := 8;
            MyLabel.Top := 178;
            MyLabel.Font.Style:=[fsItalic];
            MyLabel.Width := MediaGroupBox.Width - 15;
          end;

          MyLabel.Caption := tb.FieldAsString( tb.FieldIndex['aname'] );
       end;

Bummi 7. Feb 2013 21:54

AW: Label korrekt zur Laufzeit erzeugen?
 
@Sir Rufo wir meinen das gleiche, allerdings ist Deine Beschreibung sicher besser.

AlexII 7. Feb 2013 21:55

AW: Label korrekt zur Laufzeit erzeugen?
 
Thx! Es funkt, nur die Label Eingenschaften sind mal so mal so, also nicht immer die gleichen. Wie kann ich die Eigenschaften in beiden Fällen gleich setzen?

Sir Rufo 7. Feb 2013 22:01

AW: Label korrekt zur Laufzeit erzeugen?
 
Zitat:

Zitat von AlexII (Beitrag 1202507)
Thx! Es funkt, nur die Label Eingenschaften sind mal so mal so, also nicht immer die gleichen. Wie kann ich die Eigenschaften in beiden Fällen gleich setzen?

Ähhm, es so schreiben, dass diese Eigenschaften immer gesetzt werden, also nicht in den
Delphi-Quellcode:
if ... then
Teil?
Delphi-Quellcode:
       DetailsTitleLabel.Caption := tb.FieldAsString( tb.FieldIndex['mediatitle'] );

        if tb.FieldAsString( tb.FieldIndex['aname'] ) <> '' then
        begin
          // Label suchen
          MyLabel := TLabel( FindComponent( 'test1' ) );

          // Wenn kein Label gefunden wurde
          if MyLabel = nil then
          begin
            // dann müssen wir uns einen anlegen
            MyLabel := TLabel.Create( Self );
            MyLabel.Name := 'test1';
          end;

          // und ab hier haben wir gesichert eine MyLabel Instanz

          MyLabel.Parent := MediaGroupBox;
          MyLabel.WordWrap := True;
          MyLabel.Left := 8;
          MyLabel.Top := 178;
          MyLabel.Font.Style:=[fsItalic];
          MyLabel.Width := MediaGroupBox.Width - 15;

          MyLabel.Caption := tb.FieldAsString( tb.FieldIndex['aname'] );
       end;

AlexII 7. Feb 2013 22:09

AW: Label korrekt zur Laufzeit erzeugen?
 
Und wie und wo vernichte ich das Label wenn den Autor nicht mehr gibt?

Mit MyLabel.Free; verschwindet mein ganzes Programm. :gruebel:

Sir Rufo 7. Feb 2013 22:13

AW: Label korrekt zur Laufzeit erzeugen?
 
Zitat:

Zitat von AlexII (Beitrag 1202509)
Und wie und wo vernichte ich das Label wenn den Autor nicht mehr gibt? :gruebel:

Also ein wenig nachdenken ist ja manchmal nicht schlecht ... und etwas mehr Information, wie du erkennst, dass es da was nicht mehr geben soll ...

aber ich tippe mal darauf
Delphi-Quellcode:
       DetailsTitleLabel.Caption := tb.FieldAsString( tb.FieldIndex['mediatitle'] );

        // Label suchen
        MyLabel := TLabel( FindComponent( 'test1' ) );

        // Gibt es einen Autor?
        if tb.FieldAsString( tb.FieldIndex['aname'] ) <> '' then
          begin
            // Wenn kein Label gefunden wurde
            if MyLabel = nil then
              begin
                // dann müssen wir uns einen anlegen
                MyLabel := TLabel.Create( Self );
                MyLabel.Name := 'test1';
              end;

            // und ab hier haben wir gesichert eine MyLabel Instanz

            MyLabel.Parent := MediaGroupBox;
            MyLabel.WordWrap := True;
            MyLabel.Left := 8;
            MyLabel.Top := 178;
            MyLabel.Font.Style:=[fsItalic];
            MyLabel.Width := MediaGroupBox.Width - 15;
 
            MyLabel.Caption := tb.FieldAsString( tb.FieldIndex['aname'] );
         end
       else
         // kein Autor, kein Label
         MyLabel.Free;

AlexII 7. Feb 2013 22:18

AW: Label korrekt zur Laufzeit erzeugen?
 
Hm... hab ich so gemacht, und wenn es keinen Autor gibt wird das ganze Programm unsichtbar, es verschwindet irgendwohin, muss es dann über Task-Manager als Prozess beenden. :gruebel:

Sir Rufo 7. Feb 2013 22:19

AW: Label korrekt zur Laufzeit erzeugen?
 
Zitat:

Zitat von AlexII (Beitrag 1202509)
Mit MyLabel.Free; verschwindet mein ganzes Programm. :gruebel:

Das ist so schon korrekt, warum das würde jetzt zu weit führen ... kann man aber hier im Forum suchen

BTW:

Wenn du die Caption von einem Label mit '' befüllst, dann sieht keine S** ob da ein Label ist oder nicht.

Warum willst du also so eine Erzeugungs- und Vernichtungsorgie starten?

Meinetwegen setze Visible vom Label auf true oder false ... so ist das Murks

AlexII 7. Feb 2013 22:21

AW: Label korrekt zur Laufzeit erzeugen?
 
Weil anstelle dieses Labels ein anderes Label erstellt werden soll, mit anderen Infos.

Sir Rufo 7. Feb 2013 22:21

AW: Label korrekt zur Laufzeit erzeugen?
 
Zitat:

Zitat von AlexII (Beitrag 1202511)
Hm... hab ich so gemacht, und wenn es keinen Autor gibt wird das ganze Programm unsichtbar, es verschwindet irgendwohin, muss es dann über Task-Manager als Prozess beenden. :gruebel:

Glaube ich nicht ...

erst kommt
Delphi-Quellcode:
        // Label suchen
        MyLabel := TLabel( FindComponent( 'test1' ) );
und dann
Delphi-Quellcode:
        // Gibt es einen Autor?
        if tb.FieldAsString( tb.FieldIndex['aname'] ) <> '' then
          begin
            ...
          end
       else
         // kein Autor, kein Label
         MyLabel.Free;
Bei dir sieht es wohl noch so aus
Delphi-Quellcode:
        // Gibt es einen Autor?
        if tb.FieldAsString( tb.FieldIndex['aname'] ) <> '' then
          begin
            // Label suchen
            MyLabel := TLabel( FindComponent( 'test1' ) );
            ...
          end
       else
         // kein Autor, kein Label
         MyLabel.Free;
gelle ;)

Sir Rufo 7. Feb 2013 22:24

AW: Label korrekt zur Laufzeit erzeugen?
 
Zitat:

Zitat von AlexII (Beitrag 1202513)
Weil anstelle dieses Labels ein anderes Label erstellt werden soll, mit anderen Infos.

Nun wenn es dich glücklich macht ... aber leg dir mal eine kleine Test-Projekt an und spiele ein wenig mit dem Visible herum ;)

AlexII 7. Feb 2013 22:30

AW: Label korrekt zur Laufzeit erzeugen?
 
Thx... läuft alles!

Sir Rufo 7. Feb 2013 22:34

AW: Label korrekt zur Laufzeit erzeugen?
 
Ich würde ja ein Label
Delphi-Quellcode:
Test1
fest anlegen und dann sieht der Code wie folgt aus:
Delphi-Quellcode:
// Gibt es einen Autor?
if tb.FieldAsString( tb.FieldIndex['aname'] ) <> '' then
  Test1.Caption := tb.FieldAsString( tb.FieldIndex['aname'] )
else
  Test1.Caption := 'Some other information with a DRY KISS';

Furtbichler 8. Feb 2013 07:21

AW: Label korrekt zur Laufzeit erzeugen?
 
Bzw. sich gleich darauf besinnen, das das Label eine bestimmte Information anzeigen soll. Nämlich den Namen des Autors, wenn der Name angegeben ist, bzw. etwas anderes, wenn der Autor nicht angegeben ist:

Delphi-Quellcode:
MyLabel.Caption := AuthorInfo(Tb);
...

Function AuthorInfo (aDataSet : TDataset);
Begin
  Result := aDataSet['aname'];
  if Result='' then
    Result := 'Something else';
End;
Alternativ (und vermutlich noch besser) wäre es, dem Dataset ein berechnetes Feld 'AuthorInfo' zu spendieren. Dann ist die Logik dort, wo sie vermutlich hingehört und man kann diese info überall anzeigen.

Sir Rufo 8. Feb 2013 09:15

AW: Label korrekt zur Laufzeit erzeugen?
 
Zitat:

Zitat von AlexII (Beitrag 1202516)
Thx... läuft alles!

Und was war jetzt der Fehler?

AlexII 8. Feb 2013 11:05

AW: Label korrekt zur Laufzeit erzeugen?
 
Syntaktischer Natur!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 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