![]() |
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:
Ich weiß nicht wo mein Fehler liegt, es stürtz auch erst beim 2. oder 3. Aufruf der Funktion ab.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; Kann mir jemand sagen was ich falsch mache. Vielen Dank im voraus. |
AW: Fehler beim Parent setzen eines Labels
Zitat:
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:
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: |
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. ![]() 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. |
AW: Fehler beim Parent setzen eines Labels
Zitat:
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. |
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. |
AW: Fehler beim Parent setzen eines Labels
Und was hat das mit den verwendeten Anzeigekomponenten zu tun?
|
AW: Fehler beim Parent setzen eines Labels
Zitat:
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. |
AW: Fehler beim Parent setzen eines Labels
Hallo,
warum
Delphi-Quellcode:
warum nicht
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;
Delphi-Quellcode:
Nicht dass du in Text_Objects andere Komponenten reinpackst mit Tag=0,
if (Form1.Text_Objects[zahl] is TLabel of
kann es knallen. Heiko |
AW: Fehler beim Parent setzen eines Labels
Zitat:
|
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:
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. |
AW: Fehler beim Parent setzen eines Labels
Wenn ich Chat lese, denke ich, wurden auch irgendwelche TCP/Socket/Irgendwas-Komponenten verwendet, oder? Wenn dann an einer solchen Komponente eine Nachricht ankommt, das Event, ist das dann nicht in dem Fall immer als eigener Thread implementiert? Muss daher die Darstellung (e.g. die Panels usw.) nicht threadsafe gemacht werden?
|
AW: Fehler beim Parent setzen eines Labels
so
ich habe es jetzt in eine Klass geschrieben:
Delphi-Quellcode:
In der Form1 sieht das dann so aus
unit ChatSystem_Class;
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; type TChatSystem = class private current_Height: Integer; Panel: TPanel; ScrollBar: TScrollBar; Objekte: TObjectList; PopupMenu: TPopupMenu; public Constructor Create(Panel_Need: TPanel; Scrollbar_Need: TScrollBar; PopupMenu_Need: TPopupMenu); Destructor Free; procedure onMouseOver(Sender: TObject); procedure onMouseOut(Sender: TObject); procedure onMouseClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 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; end; implementation Constructor TChatSystem.Create(Panel_Need: TPanel; Scrollbar_Need: TScrollBar; PopupMenu_Need: TPopupMenu); begin Panel := Panel_Need; ScrollBar := Scrollbar_Need; PopupMenu := PopupMenu_Need; Objekte := TObjectList.Create; end; Destructor TChatSystem.Free; begin Objekte.Clear; Panel.Free; ScrollBar.Free; PopupMenu.Free; end; procedure TChatSystem.newMessage; begin renderLabels; ScrollBar.Position := current_Height - ScrollBar.PageSize; renderLabels; end; procedure TChatSystem.renderLabels; var zahl: Integer; begin current_Height := 0; for zahl := 0 to Objekte.count - 1 do begin // Label if Objekte[zahl] is TLabel then begin (Objekte[zahl] as TLabel).Top := current_Height - ScrollBar.Position; current_Height := current_Height + (Objekte[zahl] as TLabel).Height; end; // Bild if Objekte[zahl] is TImage then begin // Ausrechnen der Größe (Objekte[zahl] as TImage).Height := Panel.Height div 3; (Objekte[zahl] as TImage).Width := (Objekte[zahl] as TImage) .Picture.Width div ((Objekte[zahl] as TImage) .Picture.Height div (Objekte[zahl] as TImage).Height); // Ausrechen der Position (Objekte[zahl] as TImage).Top := current_Height - ScrollBar.Position; current_Height := current_Height + (Objekte[zahl] as TImage).Height; end; // Progressbar if Objekte[zahl] is TProgressBar then begin (Objekte[zahl] as TProgressBar).Top := current_Height - ScrollBar.Position; current_Height := current_Height + (Objekte[zahl] as TProgressBar).Height; end; // Button if Objekte[zahl] is TButton then begin (Objekte[zahl] as TButton).Top := current_Height - ScrollBar.Position; current_Height := current_Height + (Objekte[zahl] as TButton).Height; end; end; current_Height := current_Height + 10; if Panel.Height < current_Height then begin ScrollBar.Max := current_Height; ScrollBar.PageSize := Panel.Height; ScrollBar.Enabled := true; end else begin ScrollBar.Enabled := false; end; Application.ProcessMessages; end; procedure TChatSystem.addUserText(Text: String); var Label_Create: TLabel; begin Label_Create := TLabel.Create(Panel); Label_Create.Parent := Panel; Label_Create.Caption := Text; Label_Create.Top := 0; Label_Create.Left := 0; Label_Create.Autosize := false; Label_Create.Font.size := 13; Label_Create.Width := Panel.Width; Label_Create.Height := 20; Label_Create.Font.Color := clHotLight; Label_Create.Tag := Objekte.count; Label_Create.OnMouseDown := onMouseClick; Label_Create.Cursor := crHandPoint; Objekte.Add(Label_Create); // newMessage; end; procedure TChatSystem.addText(Text: String); var Label_Create: TLabel; begin Label_Create := TLabel.Create(Panel); Label_Create.Parent := Panel; Label_Create.Caption := Text; Label_Create.Top := 0; Label_Create.Left := 10; Label_Create.Autosize := true; Label_Create.Tag := Objekte.count; Label_Create.OnMouseEnter := onMouseOver; Label_Create.OnMouseLeave := onMouseOut; Objekte.Add(Label_Create); newMessage; end; procedure TChatSystem.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 TChatSystem.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 TChatSystem.onMouseClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ssRight in Shift then begin PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; end; procedure TChatSystem.addImage(Text: String); var Image_Create: TImage; begin Image_Create := TImage.Create(Panel); Image_Create.Parent := Panel; 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 := Objekte.count; Image_Create.OnMouseDown := onMouseClick; Image_Create.DragMode := dmAutomatic; Objekte.Add(Image_Create); newMessage; end; procedure TChatSystem.addProgessbar(id: Integer); var Progressbar_Create: TProgressBar; begin Progressbar_Create := TProgressBar.Create(Panel); Progressbar_Create.Parent := Panel; 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 := Objekte.count; Progressbar_Create.MarqueeInterval := id; Objekte.Add(Progressbar_Create); newMessage; end; procedure TChatSystem.addButton(id: Integer; Text: String); var Button_Create: TButton; begin Button_Create := TButton.Create(Panel); Button_Create.Parent := Panel; 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 := Objekte.count; // Button_Create.TBDockHeight := id; Objekte.Add(Button_Create); newMessage; end; end.
Delphi-Quellcode:
Das ist lange nicht alles aber ich hoffe das reicht um einen Eindruck zu bekommen wie ich versuche die
unit Main;
interface uses Winapi.Windows, Winapi.Messages ... type TForm1 = class(TForm) IdTCPClient1: TIdTCPClient; IdTCPServer1: TIdTCPServer; ... procedure Netzwerkbeitreten1Click(Sender: TObject); procedure Netzwerkerstellen1Click(Sender: TObject); ... var //Ich habe alles nicht relevante rausgelassen da die Unit fast 700 Zeilen hat ChatSystem : TChatSystem; implementation uses Erstellen, Beitreten... {$R *.dfm} procedure TForm1.IdTCPClient1Disconnected(Sender: TObject); begin ChatSystem.addUserText('server'); ChatSystem.addText('Die Verbindung zum Server wurde getrennt'); ClientThread.Terminate; end; procedure TForm1.IdTCPServer1Disconnect(AContext: TIdContext); var Name: String; begin Name := Form1.removeUser(AContext.Binding.IP); sendServerMessage(Name + ' verließ den Server'); Server.updateUser; Form1.updateListView; end; procedure TForm1.FormCreate(Sender: TObject); begin ChatSystem := TChatsystem.Create(Panel1, ScrollBar1, Bild); end; end. Klasse zu nutzen. Es wird immer komischer, wenn ich das Programm debugge funktioniert es einwandfrei, wenn nicht dann nicht. Ich versteh das einfach nicht. |
AW: Fehler beim Parent setzen eines Labels
hm,
soweit ich das verstanden habe liegt es also am Thread. Gibt es wirklich keine Möglichkeit diesen Fehler zu beheben? und müsste nicht bei dem RichEdit derselbe Fehler kommen? |
AW: Fehler beim Parent setzen eines Labels
Die VCL ist nunmal nicht threadsicher und daher darf man diese einfach grundsätzlich nicht unsynchronisiert in Threads verwenden *punkt*
Ein TLabel ist keine eigenständige Komponente, sondern sie hängt sich "brutal" in dessen Parent, um sich auf dessen Canvas zu zeichnen. Beim RichEdit gibt es vielleicht an dieser Stelle zufällig grade kein Problem, aber daß heißt nicht, daß es nicht wo anders knallen könnte. PS: Die Owner- und Parentbeziehungen werden auch noch in mehreren TList verwaltet, welche nicht threadsicher sind und hierbei bearbeitet werden, außerdem gibt es viele weitere gemeinsam genutze Komponenten, wie Fonts, Brushs, Pens usw., welche ebenfalls nicht threadsicher sind. Fazit: Man macht das einfach nicht, selbst wenn es zufällig dennoch scheinbar mal keine Probleme zu geben scheint. Und dazu wird das Messagehandling mit dem Thread verlinkt, wo eine Komponente erstellt wird, also da wo z.B. das ![]() Delphi hat von sich aus nur im Hauptthread eine Messagebehandlung integriert. In allen anderen Threads müsste man dieses selber erledigen. Das merkt man sehr gut, denn wenn man den Haupttread auslastet und der VCL keine Möglichkeit bietet diese Messages zu verarbeiten, dann hängen alle Fenster. |
AW: Fehler beim Parent setzen eines Labels
Zitat:
Delphi-Quellcode:
?
Application.ProcessMessages;
|
AW: Fehler beim Parent setzen eines Labels
Nein, denn dieses ist nur für den Hauptthread, da darin ebenfalls auf globale VCL-Dinge zugegriffen wird.
Also praktisch alles nur NonVCL. ![]() ![]() ![]() |
AW: Fehler beim Parent setzen eines Labels
ok,
soweit so gut. Ich hab mich mal eine kurze Zeit mit C++ beschäftigt und da stand im Buch das jede Anwendung dem Windows eine Existenz nachricht schicken muss. Ich hab mich jetzt ein bisschen Umgeschaut aber ich habe nirgends ein Beispiel dafür gefunden wie ich diese drei Funktionen anwenden könnte.(Kann auch sein, dass ich das falsche Wort gegoogelt habe.) |
AW: Fehler beim Parent setzen eines Labels
Was wirklich niemand wie man diese Funktionen anwendenden kann?
|
AW: Fehler beim Parent setzen eines Labels
Was nun genau?
Wenn du auf die VCL zugreifst, dann einfach immer nur synchronisiert und schon gibt es keinerlei Probleme. Existenznachicht? Nee, Windows guckt nur, ob Messages verarbeitet werden, wenn welche in der MessageQueue rumgammeln, und wenn sich da eine Weile lang nix tut, dann hängt für Windows diese Anwendung. |
AW: Fehler beim Parent setzen eines Labels
Zitat:
Zitat:
|
AW: Fehler beim Parent setzen eines Labels
Ich hab ja nur am Rande mitgelesen,
aber schau einmal nach tThread und synchronize. Und wenn Du hier die Suche bemühst, könnte da auch etwas herum kommen. Gruß K-H |
AW: Fehler beim Parent setzen eines Labels
ok,
Ich habe mir diese Tutorial durchgelesen: ![]() Zitat:
Wenn ich gerade ein Label schreibe und bevor es fertiggestellt wurde Delphi bei Vcl weitermacht knallt es. Ich dachte ich könnte das Problem so lösen indem ich jeden Aufruf von addIrgendwas synchronisiere:
Delphi-Quellcode:
Aber Synchronize ist keine Procedure oder Funktion:
Synchronize(ChatSystem.addUserText(Nick));
[DCC Fehler] Server.pas(224): E2014 Anweisung erforderlich, aber Ausdruck vom Typ 'Integer' gefunden Hab ich da irgendetwas falsch verstanden? |
AW: Fehler beim Parent setzen eines Labels
Mithilfe eines Freundes könnte ich das Problem beim Client lösen indem ich dem Thread eine Funktion addUserText und addText gemacht und die synchronisiert habe.
Doch wie soll ich dem Server Thread eine Procedure oder eine Funktion hinzufügen? |
AW: Fehler beim Parent setzen eines Labels
ok
Ich hab mir eine eigene Komponente geschriebn, doch kann ich in der Komponente eine Scrollbar benutzten, auf jedenfall wird sie irgendwie nicht angezeigt.
Delphi-Quellcode:
unit ChatEdit;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.StdCtrls, Winapi.CommCtrl , Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Contnrs, Vcl.Themes; type TChatEdit = class(TCustomControl) private FFont: TFont; FLines: TStringList; Special_Objects: TObjectList; FScrollbar : TScrollBar; procedure setLines(Value: TStringList); procedure setFont(Value: TFont); procedure setScrollbar(Value : TScrollBar); procedure onScrollbarChange(Sender: TObject); { Private-Deklarationen } protected procedure Paint; override; { Protected-Deklarationen } public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Clear; procedure AddLine(Text: String); function Count: Integer; { Public-Deklarationen } published property OnClick; property OnMouseMove; property Font: TFont read FFont write setFont; property Lines: TStringList read FLines write setLines; property Scrollbar : TScrollBar read FScrollbar write setScrollbar; { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Chat', [TChatEdit]); end; constructor TChatEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); FLines := TStringList.Create; FFont := TFont.Create; Special_Objects := TObjectList.Create; FScrollbar := TScrollBar.Create(self); FScrollbar.Kind := sbVertical; FScrollbar.OnChange := onScrollbarChange; FScrollbar.Top := 0; FScrollbar.Width := 20; FLines.Add(Self.GetNamePath); end; destructor TChatEdit.Destroy; begin FFont.Destroy; Special_Objects.Free; FLines.Free; inherited Destroy; end; procedure TChatEdit.setFont(Value : TFont); begin FFont.Assign(Value); Canvas.Font.Assign(FFont); Paint; end; procedure TChatEdit.setLines(Value: TStringList); begin FLines.Assign(Value); Paint; end; procedure TChatEdit.setScrollbar(Value: TScrollBar); begin FScrollbar.Assign(Value); Paint; end; procedure TChatEdit.Paint; var zahl, height: Integer; begin inherited; height := Canvas.TextHeight('h'); for zahl := 0 to FLines.Count - 1 do begin Canvas.TextOut(0, zahl * height - FScrollbar.Position, FLines[zahl]); end; if zahl * height > Self.Height then begin FScrollbar.Max := zahl * height; FScrollbar.PageSize := zahl * height; FScrollbar.Enabled := true; end else begin FScrollbar.Enabled := false; end; FScrollbar.Left := Self.Width - FScrollbar.Width; FScrollbar.Height := Self.Height; end; procedure TChatEdit.onScrollbarChange(Sender: TObject); begin Paint; end; function TChatEdit.Count: Integer; begin Result := FLines.Count; end; procedure TChatEdit.Clear; begin FLines.Clear; end; procedure TChatEdit.AddLine(Text: string); begin FLines.Add(Text); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 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