AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Eigene Komponente: Problem mit Property Lines: TStrings...
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Komponente: Problem mit Property Lines: TStrings...

Ein Thema von Ares · begonnen am 1. Dez 2005 · letzter Beitrag vom 2. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

Eigene Komponente: Problem mit Property Lines: TStrings...

  Alt 1. Dez 2005, 17:53
Hallo!

In meinem anderen Beitrag suche ich nach einem Label, das mehr als 255 Zeichen aufnehmen kann (http://www.delphipraxis.net/internal...=465683#465683). Da keine wirkliche Lösung in Sicht ist, wollte ich es einfach mal mit einer eigenen Komponente versuchen. Ich wollte von einem TLabel ableiten, eine Eigenschaft Lines vom Typ TStrings hinzufügen. Die Unit sieht bis jetzt so aus:

Delphi-Quellcode:
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 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".

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:
---------------------------
Fehler
---------------------------
Zugriffsverletzung bei Adresse 40005982 in Modul 'rtl60.bpl'. Lesen von Adresse 00000026.
---------------------------
OK
---------------------------
Was mache ich hier falsch???


Besten Dank
Ares
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#2

Re: Eigene Komponente: Problem mit Property Lines: TStrings.

  Alt 1. Dez 2005, 18:07
Im Konstruktor würde ich inherited zuerst aufrufen.
Die Set-Methode sollte ungefähr so aussehen:
Delphi-Quellcode:
procedure TMyLabel.setLines(newLines: TStrings);
begin
  if Assigned(newLines) then
    FLines.Assign(newLines)
  else
    FLines.Clear;
  //... alles weitere
end;
Gruß, teebee
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#3

Re: Eigene Komponente: Problem mit Property Lines: TStrings.

  Alt 1. Dez 2005, 18:11
Zitat von teebee:
Im Konstruktor würde ich inherited zuerst aufrufen.
Die Set-Methode sollte ungefähr so aussehen:
Delphi-Quellcode:
procedure TMyLabel.setLines(newLines: TStrings);
begin
  if Assigned(newLines) then
    FLines.Assign(newLines)
  else
    FLines.Clear;
  //... alles weitere
end;
Gruß, teebee

Danke, ich habe beides geändert. Leider hat es keine Besserung gebracht...
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#4

Re: Eigene Komponente: Problem mit Property Lines: TStrings.

  Alt 1. Dez 2005, 18:46
Bei mir funktioniert es so. Hast Du die Komponente auch neu installiert?
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#5

Re: Eigene Komponente: Problem mit Property Lines: TStrings.

  Alt 1. Dez 2005, 19:32
Zitat von teebee:
Bei mir funktioniert es so. Hast Du die Komponente auch neu installiert?

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
  Mit Zitat antworten Zitat
Nightshade

Registriert seit: 7. Jan 2003
Ort: Menden
192 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Eigene Komponente: Problem mit Property Lines: TStrings.

  Alt 1. Dez 2005, 19:36
Nur mal so zur Erklärung :

  FLines := newLines; 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.


Mit
 FLines.Assign(newLines) werden die Daten aus "NewLines" in "FLines" kopiert, der Pointer zeigt weiterhin auf die richtige Liste.

( 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.
Christian
Killing for peace is like fucking for virginity

Nightshade
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Eigene Komponente: Problem mit Property Lines: TStrings.

  Alt 1. Dez 2005, 23:09
Zitat von teebee:
Im Konstruktor würde ich inherited zuerst aufrufen.
Die Set-Methode sollte ungefähr so aussehen:
Delphi-Quellcode:
procedure TMyLabel.setLines(newLines: TStrings);
begin
  if Assigned(newLines) then
    FLines.Assign(newLines)
  else
    FLines.Clear;
  //... alles weitere
end;
Gruß, teebee
Wozu die Unterscheidung? Assign(Nil) löscht auch die Liste, also einfach nur FLines.Assign(NewLines); So, und noch zu einem anderen Ding was ich so sehe: Verschiebe das Anlegen der FLines nach dem inherited Create Aufruf.
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#8

Re: Eigene Komponente: Problem mit Property Lines: TStrings.

  Alt 2. Dez 2005, 09:19
Zitat von Muetze1:
Wozu die Unterscheidung? Assign(Nil) löscht auch die Liste, also einfach nur FLines.Assign(NewLines);
Assign(Nil) auf einer TStringList-Instanz führt zu einer EConvertError-Exception, da TStrings.Assign an TPersistent.Assign weitergeleitet wird, wenn kein TStrings ankommt. Auszug aus classes.pas von D3 (sieht ähnlich aus in D6):
Delphi-Quellcode:
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;
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.

Gruß, teebee
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Eigene Komponente: Problem mit Property Lines: TStrings.

  Alt 2. Dez 2005, 09:46
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.
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#10

Re: Eigene Komponente: Problem mit Property Lines: TStrings.

  Alt 2. Dez 2005, 10:23
Zitat von Robert Marquardt:
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.
Welche Delphiversion benutzt du denn? Wenn ich im Objektinspektor Text in das Captionfeld eingebe ist nach 255 Zeichen Schluss... Wenn ich z.B. den Finger auf A lasse wird das Label munter befüllt, nach 255 Zeichen ertönt diese "Windows-Boing" und es ist keine weitere Eingabe möglich.

Wie kann ich denn den IDE-Editor für die Strings ändern bzw. austauschen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 Uhr.
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