Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Fehler beim Parent setzen eines Labels (https://www.delphipraxis.net/169086-fehler-beim-parent-setzen-eines-labels.html)

CreativeMD 27. Jun 2012 19:40

Fehler beim Parent setzen eines Labels
 
Hi,
ja wie der Fehler schon sagt gibt es einen Fehler beim setzen eines Parent beim Labels.

Delphi-Quellcode:

var
Label_Create: TLabel;

//Nach einigen Zeilen Code
...

procedure addText(Text: String);
begin
  Label_Create := TLabel.Create(Form1.Panel1);
  Label_Create.Parent := Form1.Panel1;

  Label_Create.Caption := Text;
  Label_Create.Top := 0;
  Label_Create.Left := 10;
  Label_Create.Autosize := true;
  Label_Create.Tag := 0;
  Label_Create.OnMouseEnter := Form1.onMouseOver;
  Label_Create.OnMouseLeave := Form1.onMouseOut;

  Form1.Text_Objects.Add(Label_Create);

  newMessage;

end;
Ich weiß nicht wo mein Fehler liegt, es stürtz auch erst beim 2. oder 3. Aufruf der Funktion ab.

Kann mir jemand sagen was ich falsch mache.

Vielen Dank im voraus.

himitsu 27. Jun 2012 19:55

AW: Fehler beim Parent setzen eines Labels
 
Zitat:

Zitat von CreativeMD (Beitrag 1172731)
ja wie der Fehler schon sagt gibt es einen Fehler beim setzen eines Parent beim Labels.

Der Fehler sagt absolut garnichts.
Also was für ein Fehler denn?

Wo/Wann wird diese Prozedur aufgerufen?





weitere Tipps:

Und warum ist sie keine Methode der TForm1, wo doch alles auf diese Form hinausläuft?

Zitat:

Delphi-Quellcode:
var
  Label_Create: TLabel;

Gibt es einen Grund, warum das keine lokale Variable ist?
Oder nutzt du wirklich wo anders nochmal diese Referenz des Labels?

PS: "Parent setzen" ist ein Wort, wobei "das Setzen" (beim Setzen) das Hauptwort ist. :zwinker:

CreativeMD 28. Jun 2012 15:50

AW: Fehler beim Parent setzen eines Labels
 
Ich arbeite an einem Chatprogramm
und zur Verschönerung nehme ich kein Memo, sondern
füge die Objekte in ein Panel.

Chatsystem.pas:
Delphi-Quellcode:
unit ChatSystem;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdContext, Vcl.ComCtrls, Vcl.StdCtrls,
  IdCustomTCPServer, IdTCPServer, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, Vcl.Menus, Vcl.ExtCtrls, mmSystem, ClipBrd, User, Contnrs,
  Data.DB, Datasnap.DBClient, Datasnap.Win.MConnect, Datasnap.Win.SConnect,
  Vcl.OleCtrls, SHDocVw, JvExStdCtrls, JvRichEdit, ShellApi;

procedure renderLabels;
procedure addButton(id: Integer; Text: String);
procedure addProgessbar(id: Integer);
procedure addImage(Text: String);
procedure addText(Text: String);
procedure addUserText(Text: String);
procedure newMessage;
procedure Create;

implementation

uses Main, Optionen, Aufnahme, Beitreten, Erstellen, Favoriten, Feld, Player,
  FileSystem;

var
  Label_Create: TLabel;
  Image_Create: TImage;
  Progressbar_Create: TProgressBar;
  Button_Create: TButton;
  current_Height : Integer;

procedure Create;
begin

end;

  procedure newMessage;
  begin
  renderLabels;
    Form1.ScrollBar1.Position := current_Height - Form1.ScrollBar1.PageSize;
    renderLabels;
  end;

procedure renderLabels;
var
  zahl: Integer;
begin

  current_Height := 0;

  for zahl := 0 to Form1.Text_Objects.count - 1 do
  begin

    case (Form1.Text_Objects[zahl] as TComponent).Tag of
      0:
        begin
          // Label
          (Form1.Text_Objects[zahl] as TLabel).Top := current_Height -
            Form1.ScrollBar1.Position;
          current_Height := current_Height +
            (Form1.Text_Objects[zahl] as TLabel).Height;
        end;

      1:
        begin
          // Ausrechnen der Größe
          (Form1.Text_Objects[zahl] as TImage).Height :=
            Form1.Panel1.Height div 3;

          (Form1.Text_Objects[zahl] as TImage).Width :=
            (Form1.Text_Objects[zahl] as TImage)
            .Picture.Width div ((Form1.Text_Objects[zahl] as TImage)
            .Picture.Height div (Form1.Text_Objects[zahl] as TImage).Height);

          // Ausrechen der Position
          (Form1.Text_Objects[zahl] as TImage).Top := current_Height -
            Form1.ScrollBar1.Position;
          current_Height := current_Height +
            (Form1.Text_Objects[zahl] as TImage).Height;
        end;
      2:
        begin
          // Progressbar
          (Form1.Text_Objects[zahl] as TProgressBar).Top := current_Height -
            Form1.ScrollBar1.Position;
          current_Height := current_Height +
            (Form1.Text_Objects[zahl] as TProgressBar).Height;
        end;
      3:
        begin
          // button
          (Form1.Text_Objects[zahl] as TButton).Top := current_Height -
            Form1.ScrollBar1.Position;
          current_Height := current_Height +
            (Form1.Text_Objects[zahl] as TButton).Height;
        end;
    end;

  end;
  current_Height := current_Height + 10;

  if Form1.Panel1.Height < current_Height then
  begin
  Form1.ScrollBar1.Max := current_Height;
    Form1.ScrollBar1.PageSize := Form1.Panel1.Height;
    Form1.ScrollBar1.Enabled := true;

  end
  else
  begin
    Form1.ScrollBar1.Enabled := false;
  end;



 Application.ProcessMessages;
end;

procedure addUserText(Text: String);
begin
  Label_Create := TLabel.Create(Form1.Panel1);
  Label_Create.Parent := Form1.Panel1;

  Label_Create.Caption := Text;
  Label_Create.Top := 0;
  Label_Create.Left := 0;
  Label_Create.Autosize := false;
  Label_Create.Font.size := 13;

  Label_Create.Width := Form1.Panel1.Width;
  Label_Create.Height := 20;

  Label_Create.Font.Color := clHotLight;

  Label_Create.Tag := 0;
  Label_Create.OnMouseDown := Form1.onMouseClick;
  Label_Create.Cursor := crHandPoint;

  Form1.Text_Objects.Add(Label_Create);

  //newMessage;
end;

procedure addText(Text: String);
begin
  Label_Create := TLabel.Create(Form1.Panel1);
  Label_Create.Parent := Form1.Panel1;

  Label_Create.Caption := Text;
  Label_Create.Top := 0;
  Label_Create.Left := 10;
  Label_Create.Autosize := true;
  Label_Create.Tag := 0;
  Label_Create.OnMouseEnter := Form1.onMouseOver;
  Label_Create.OnMouseLeave := Form1.onMouseOut;

  Form1.Text_Objects.Add(Label_Create);

  newMessage;

end;

procedure onMouseOver(Sender: TObject);
begin
  case (Sender as TComponent).Tag of
    0:
      (Sender as TLabel).Font.Style := (Sender as TLabel).Font.Style + [fsBold];
end;

renderLabels;
end;

procedure onMouseOut(Sender: TObject);
begin
  case (Sender as TComponent).Tag of
    0:
      (Sender as TLabel).Font.Style := (Sender as TLabel).Font.Style - [fsBold];
end;
renderLabels;
end;

procedure addImage(Text: String);
begin
  Image_Create := TImage.Create(Form1.Panel1);
  Image_Create.Parent := Form1.Panel1;
  Image_Create.Picture.LoadFromFile(Text);
  Image_Create.Height := 150;
  Image_Create.Width := Image_Create.Picture.Width div
    (Image_Create.Picture.Height div Image_Create.Height);
  Image_Create.Stretch := true;
  Image_Create.Top := 0;
  Image_Create.Left := 10;
  Image_Create.Tag := 1;
  Image_Create.OnMouseDown := Form1.onMouseClick;
  Image_Create.DragMode := dmAutomatic;

  Form1.Text_Objects.Add(Image_Create);

  newMessage;
end;

procedure addProgessbar(id: Integer);
begin
  Progressbar_Create := TProgressBar.Create(Form1.Panel1);
  Progressbar_Create.Parent := Form1.Panel1;
  Progressbar_Create.Left := 10;
  Progressbar_Create.Top := 0;

  Progressbar_Create.Max := 100;
  Progressbar_Create.Position := 0;
  Progressbar_Create.Height := 20;
  Progressbar_Create.Width := 100;

  Progressbar_Create.Tag := 2;
  Progressbar_Create.MarqueeInterval := id;

  Form1.Text_Objects.Add(Progressbar_Create);

  newMessage;


end;

procedure addButton(id: Integer; Text: String);
begin
  Button_Create := TButton.Create(Form1.Panel1);
  Button_Create.Parent := Form1.Panel1;
  Button_Create.Caption := Text;
  Button_Create.Left := 10;
  Button_Create.Top := 0;
  // Button_Create.Height := Form1.Canvas.TextHeight(Text) + 10;
  // Button_Create.Width := Form1.Canvas.TextWidth(Text) + 10;
  Button_Create.Tag := 3;
  // Button_Create.TBDockHeight := id;

  Form1.Text_Objects.Add(Button_Create);

  newMessage;
end;

end.
http://i.imgur.com/QRXUE.png

Der Fehler passiert, aber nur wenn der Client oder der Server Aktiv sind, aber davor hat es funktioniert
und wenn ich mit dem Compiler den Code verfolge stürzt er beim 2 oder 3 mal ab.

shmia 28. Jun 2012 16:31

AW: Fehler beim Parent setzen eines Labels
 
Zitat:

Zitat von CreativeMD (Beitrag 1172859)
... Chatprogramm und zur Verschönerung nehme ich kein Memo

Du könntest aber auch ein TRichEdit verwenden.
Damit ist es möglich, dass jeder der Chatter seinen eigenen Font + Farbe erhält.
Mit etwas Mühe kann man sogar Smilies und Avatarbilder als Grafiken in den Text einfügen.

Auf jeden Fall würdest du Dir eine Menge an (fehlerhaftem) Programmcode sparen.
Du kannst den Chatverlauf auch bequem im TXT oder RTF-Format speichern.
Scrollen und Suchen sind ebenfalls viel einfacher zu realisieren, bzw. sind von Haus aus vorhanden.

CreativeMD 28. Jun 2012 16:36

AW: Fehler beim Parent setzen eines Labels
 
ja,
aber in diese Chatsystem kann ich jedes beliebiges Objekt einfügen.
Vorallem soll man auch Daten senden können.

DeddyH 28. Jun 2012 16:41

AW: Fehler beim Parent setzen eines Labels
 
Und was hat das mit den verwendeten Anzeigekomponenten zu tun?

CreativeMD 28. Jun 2012 16:49

AW: Fehler beim Parent setzen eines Labels
 
Zitat:

Zitat von DeddyH (Beitrag 1172869)
Und was hat das mit den verwendeten Anzeigekomponenten zu tun?

Ich glaube du hast es auf das Daten senden bezogen.

Ich will das man wie in Skype einen Button hat wo man anschließend auswählen kann wohin man die Datei
downloaden will und dann sieht wie weit es fortgeschritten ist (Progessbar).
Ich kenn mich mit dem RichEdit nicht aus.

hoika 28. Jun 2012 17:56

AW: Fehler beim Parent setzen eines Labels
 
Hallo,

warum

Delphi-Quellcode:
  for zahl := 0 to Form1.Text_Objects.count - 1 do
  begin

    case (Form1.Text_Objects[zahl] as TComponent).Tag of
      0:
        begin
          // Label
          (Form1.Text_Objects[zahl] as TLabel).Top := current_Height -
            Form1.ScrollBar1.Position;
          current_Height := current_Height +
            (Form1.Text_Objects[zahl] as TLabel).Height;
        end;
warum nicht

Delphi-Quellcode:
if (Form1.Text_Objects[zahl] is TLabel of
Nicht dass du in Text_Objects andere Komponenten reinpackst mit Tag=0,
kann es knallen.


Heiko

CreativeMD 28. Jun 2012 17:58

AW: Fehler beim Parent setzen eines Labels
 
Zitat:

Zitat von hoika (Beitrag 1172879)
Delphi-Quellcode:
if (Form1.Text_Objects[zahl] is TLabel of

Könntest du mir erklären was diese Zeile Code bedeutet?

himitsu 28. Jun 2012 19:01

AW: Fehler beim Parent setzen eines Labels
 
AS = den Typ konvertieren und wenn's nicht geht, dann knallt es ganz laut
IS = auf diesen Typ prüfen (und auf dessen Nachkommen)

Wozu unsichere Prüfunen auf "Tag", wenn man auch gleich den Typen sicher prüfen kann? :zwinker:





Und dennoch fehlt so Einiges, denn ich hatte nicht umsonst nach den Aufrufen gefragt.
Also wie und wo diese Prozeduren verwendet werden.

Aber auch ansonsten ist da so Einiges nicht wirklich gut.

Zitat:

Delphi-Quellcode:
var
  Label_Create: TLabel;
  Image_Create: TImage;
  Progressbar_Create: TProgressBar;
  Button_Create: TButton;

gehört eindeutig lokal in die entsprechenden Prozeduren.

Die Objektliste gehört in diese Unit,
wobei diese Liste und die Prozeduren besser in eine Klasse reingehören sollte.
OOP ist eine tolle sache und hat viele Vorteile.

Der direkte Zugriff auf Form1 ist nicht schön,
stattdessen eher ein Property in der OOP-Klasse, wo die Form an das Objekt übergeben wird, anstatt es sich das selber holt.

Statt dem Zugriff auf die Form, würde ich diese OOP-Klasse z.B. von TPanel, TScrollBox oder Dergleichen abgeleitet werden und die behandelt dann alles (ScrollBar, die ganzen Edits und weitere Controls) ausschließlich in sich selber.


Und schwups, schon hast du ein eigenständiges System, welches man wiederverwenden kann
und außerdem ist alles zusammen an einem Ort, was eigentlich auch zusammengehören würde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz