![]() |
Eigene Komponente: Problem mit Property Lines: TStrings...
Hallo!
In meinem anderen Beitrag suche ich nach einem Label, das mehr als 255 Zeichen aufnehmen kann ( ![]()
Delphi-Quellcode:
Wenn ich die Komponente auf einem Form platziere kann ich im Objektinspektor den Eigenschaftseditor für Lines aufrufen und einen Text eingeben. Der Text (beliebig lang) wird auch in das Label "gemalt".
unit MyLabelUnit;
interface uses Windows, Messages, SysUtils, Classes, Controls, ExtCtrls, Graphics; type TMyLabel = class(TLabel) private FLines : TStrings; protected procedure setLines(newLines: TStrings); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Lines : TStrings read FLines write setLines; end; procedure Register; implementation procedure Register; begin RegisterComponents('Eigene', [TMyLabel]); end; constructor TMyLabel.Create(AOwner: TComponent); begin FLines := TStringList.Create; inherited Create(AOwner); end; destructor TMyLabel.Destroy; begin FLines.Free; inherited; end; procedure TMyLabel.setLines(newLines: TStrings); begin FLines := newLines; self.caption := FLines.GetText; end; Wenn ich den Eigenschaftseditor von Lines nochmal aufrufen oder das Projekt compilieren will, bekomme ich allerdings folgede Fehlermeldung und Delphi stürzt total ab (muss beendet werden): Zitat:
Besten Dank Ares |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Im Konstruktor würde ich inherited zuerst aufrufen.
Die Set-Methode sollte ungefähr so aussehen:
Delphi-Quellcode:
Gruß, teebee
procedure TMyLabel.setLines(newLines: TStrings);
begin if Assigned(newLines) then FLines.Assign(newLines) else FLines.Clear; //... alles weitere end; |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Zitat:
Danke, ich habe beides geändert. Leider hat es keine Besserung gebracht... |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Bei mir funktioniert es so. Hast Du die Komponente auch neu installiert?
|
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Zitat:
Klar :-) Ich habe auch schon ein eigenes Package erstellt und das installiert. Das selbe Ergebnis... Wenn ich ein neues Projekt erstelle, die Komponente auf dem Form platziere, einen Texte eingebe und dann compiliere erhalte ich die Meldung: [Fehler] RLINK32: Error opening file "D:\Projekte\test\Unit1.dfm" Noch ne Idee, was ich falsch machen könnte? Besten Dank Ares |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Nur mal so zur Erklärung :
Delphi-Quellcode:
Hier wird "FLines" (welches ein Pointer ist) ein neuer Wert zugewiesen, und zeigt nun nicht mehr auf die ursprüngliche Liste, sondern auf "NewLines". Die ursprüngliche Liste ist nur noch Datenmüll im Speicher.
FLines := newLines;
Mit
Delphi-Quellcode:
werden die Daten aus "NewLines" in "FLines" kopiert, der Pointer zeigt weiterhin auf die richtige Liste.
FLines.Assign(newLines)
( Zumindest wenn ich alles richtig verstanden habe :) ) PS : Schmeiss die Komponente vom Form und neu drauf, das sollte helfen, wenn nicht lösch mal die .DCU von der Komponente, damit er die neu kompiliert. |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Zitat:
Delphi-Quellcode:
So, und noch zu einem anderen Ding was ich so sehe: Verschiebe das Anlegen der FLines nach dem inherited Create Aufruf.
FLines.Assign(NewLines);
|
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Zitat:
Delphi-Quellcode:
Man könnte höchstens darüber diskutieren, ob man durch das Abfangen von Nil den 'unsachgemäßen' Gebrauch der Komponente verschleiert, aber das ist Geschmackssache.
procedure TStrings.Assign(Source: TPersistent);
begin if Source is TStrings then begin BeginUpdate; try Clear; AddStrings(TStrings(Source)); finally EndUpdate; end; Exit; end; inherited Assign(Source); end; Gruß, teebee |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Wieso soll ein TLabel nicht mehr als 255 Zeichen aufnehmen koennen?
Ich habe gerade nochmal nachgeprueft das mehr Zeichen gehen. Auch Zeilenumbruch ist kein Problem. Nur der Standard IDE-Editor fuer Strings kann keine Zeilenumbrueche. das kann man aber aendern. |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Zitat:
Wie kann ich denn den IDE-Editor für die Strings ändern bzw. austauschen? |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Vielleicht liegt das am OI, hast du schon mal probiert, der Caption zur Laufzeit einen String mit mehr als 255 Zeichen zuzuweisen?
|
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Delphi 6. Du darfst natuerlich nicht "Huge strings" in den Projektoptionen ausschalten.
|
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Zitat:
Zitat:
|
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Nein, ich benutze die Defaulteditoren, sprich ich gebe im Objektinspektor ein.
Wenn du die JVCL hast, dann starte doch nochmal den Installer und aktiviere "register global design editors" und installiere durch. Danach haben Strings den TStringList Editor registriert und erlauben auch mehrzeilige Texte. |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Zitat:
Parallel habe ich auch noch an meiner eigenen Komponente weiter gearbeitet. Die funktioniert jetzt auch ganz gut. Die Eigenschaften "Caption" und "AutoSize" sind nun überflüssig, werden aber noch im OI angezeigt. Hat jemand einen Tipp, wie ich die dort rausbekomme? Besten Dank Ares |
Re: Eigene Komponente: Problem mit Property Lines: TStrings.
Das kommt davon wenn du von TLabel ableitest.
Ueblicherweise sind Komponenten als Paare von Klassen implementiert, z. B. TLabel und TCustomLabel. TLabel macht nur alle Properties published. Die gesamte Implementierung liegt in TCustomLabel. Das ist noetig, da man zwar bei der Ableitung von protected nach public oder published gehen kann, aber bei weiterer Ableitung nicht mehr zurueck. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 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