![]() |
Eine StringList in einer Klasse erstellen
Hi,
ich habe eine Klasse geschrieben, in der ich unter anderem eine StringList erzeuge. Die StringList ist dafür gedacht, Text aus einem RichEdit aufzunehmen um ihn bearbeiten zu können (Suche nach bestimmten wörtern, SyntaxHighlighting). Ich habe dafür in der Klasse verschiedene Funktionen geschrieben, eine zum Erstellen der StringList, eine um sie zu bearbeiten und eine um sie wieder frei zu geben. Mein Problem ist nun allerdings, dass der Text aus dem RichEdit zwar wohl in die Stringlist geladen wird, allerdings nicht mehr ausgelesen werden kann, da der Text wieder verworfen wird. (Die StringList ist global initialisiert worden) Hier noch die Funktionen:
Delphi-Quellcode:
Wäre super wenn ihr mir helfen könntet!
class procedure TStringManipulation.ScrollListCreate(Dateiname: String);
begin ScrollList := TStringList.Create; ScrollList.LoadFromFile(Dateiname); end; class procedure TStringManipulation.ScrollListDestroy; begin FreeAndNil(ScrollList); end; -> Edit: Ok, bei der Create Funktion ist es im moment noch so dass ich den Inhalt aus einer Datei bekomme... :) Gruß AnyKey |
Re: Eine StringList in einer Klasse erstellen
Wo ist die Stringliste deklariert? Als Member?
Warum Klassenmethode? |
Re: Eine StringList in einer Klasse erstellen
Kannst du mal die Deklaration der Klasse bereitstellen?
Mir leuchtet das nicht ganz ein, dass du die StringList global deklarierst aber mit einer class function erzeugst... |
Re: Eine StringList in einer Klasse erstellen
Guten Morgen,
was spricht dagegen eine weitere Methode zu erstellen wo du die StringList wieder dem Richedit übergibst? Ewta so in der Art
Delphi-Quellcode:
(ungetestet)
TStringManipulation.putContent(lines: TStrings);
begin lines.assign(srollist); end; Aufruf in etwas so:
Delphi-Quellcode:
Grüße
putContent(DeinRichedit.lines);
Klaus |
Re: Eine StringList in einer Klasse erstellen
Hi,
danke für eure Antworten! Also, die Stringlist ist in der Klasse selbst Deklariert. Ich benutze deswegen eine Klasse, um die Funktionen gegebenenfalls später einmal wieder zu verwenden. Mein Problem ist, trotz dass ich die StringList meinem RichEdit wieder übergebe (hab die Funktion vergessen mit anzugeben) bekomme ich nur ein leeres RichEdit angezeigt. Ich benutze außerdem in der Anwendung MDI-Childs. Vielleicht fällt ja einem von euch was dazu ein. Gruß AnyKey |
Re: Eine StringList in einer Klasse erstellen
Ist von TStringManipulation ein Objekt instanziert? Also zu dem Zeitpunkt zu dem die Stringlist instanziert werden soll?
|
Re: Eine StringList in einer Klasse erstellen
TStringManipulationen ist eine Klasse:
Delphi-Quellcode:
type
TStringManipulation = Class public class procedure SelectLine(Edit: TRichEdit; Line: Integer; BgrColor: TColor); class procedure UnselectLine(Edit: TRichEdit; Line: Integer); class procedure SyntaxHighlighting(Edit: TRichEdit; Checked: Bool); class procedure Suchen(Edit: TRichEdit; SuchText: String); class procedure ScrollListCreate(Dateiname: String); class procedure ScrollListDestroy; class procedure GetScrollList(Edit: TRichEdit; Datensatz: Integer); class procedure SetScrollList(Dateiname: String); end; var ScrollList : TStringList; |
Re: Eine StringList in einer Klasse erstellen
Erstmal, wenn die Variable zur Klasse gehört, dann gehört sie doch eigentlich auch da mit rein
Und wie oft bzw. wann erstellst du diese StringListe? Ich würde sie nur beim Programmstart erstellen und am Ende freigeben, da es eh nur EINE geben kann und man so keine Speicherlecks oder Schlimmeres erst entstehen lassen kann
Delphi-Quellcode:
type
TStringManipulation = Class class var FScrollList : TStringList; class procedure Initialize; class procedure Finalize; public class procedure SelectLine(Edit: TRichEdit; Line: Integer; BgrColor: TColor); class procedure UnselectLine(Edit: TRichEdit; Line: Integer); class procedure SyntaxHighlighting(Edit: TRichEdit; Checked: Bool); class procedure Suchen(Edit: TRichEdit; SuchText: String); class procedure ScrollListLoad(Dateiname: String); class procedure ScrollListClear; class procedure GetScrollList(Edit: TRichEdit; Datensatz: Integer); class procedure SetScrollList(Dateiname: String); end; class procedure TStringManipulation.Initialize; begin FScrollList := TStringList.Create; end; class procedure TStringManipulation.Finalize; begin FScrollList.Free; end; class procedure TStringManipulation.ScrollListLoad(Dateiname: String); begin FScrollList.LoadFromFile(Dateiname); end; class procedure TStringManipulation.ScrollListClear; begin FScrollList.Clear; end; Initialization TStringManipulation.Initialize; Finalization TStringManipulation.Finalize; End. |
Re: Eine StringList in einer Klasse erstellen
Nicht schön, aber selten :)
|
Re: Eine StringList in einer Klasse erstellen
@ spaxxn: meins is nich schön?? :P
also in meiner Anwendung erstelle ich die StringList ja über meine Funktion, erst dann wenn ich sie Brauche und rufe wenn ich sie nicht mehr brauche die Funktion zum Freigeben auf. Naja aber wenn ihr alle meint das es so nicht die tollste Lösung ist, mach ichs vielleicht doch anders. Meine eigentliche frage is ja auch nur warum ich im RichEdit nichts angezeigt bekomme. Gruß AnyKey |
Re: Eine StringList in einer Klasse erstellen
Wenn du die Liste erst erstellst, wenn du sie brauchst, dann würde sich eine "richtige" Klasse besser eignen, vorallem da du ja schon die Wiederverwendbarkeit angesprochen hast.
Stell dir mal vor, du verwendest diese Klasse nun Zweimal in deiner Anwendung und nur rate mal, was da mit der StringListe passiert :angel2: |
Re: Eine StringList in einer Klasse erstellen
Ne ich meinte himitsu's Version :roll:
Lieber eine "richtige" Klasse instanzieren, und die Klassenmethoden weglassen. Das Andere ist irgendwie mit der Hand von hinten durchs linke Auge nach vorn und durchs Rechte zurück :D Aber das hat himitsu ja nun auch schon geschrieben. |
Re: Eine StringList in einer Klasse erstellen
Achso :D
Hm... mag sein dass meine "Klasse" auch nicht grad der Hammer is, aber um mal auf meine Frage zurück zu kommen, weiß denn jemand warum mein RichEdit leer bleibt? Gruß AnyKey |
Re: Eine StringList in einer Klasse erstellen
Zeig doch endlich einmal den Code, mit dem Du das Richedit befüllen willst :glaskugel:. Bislang seh ich nur die Klasse (oder hab ich was überlesen?)
|
Re: Eine StringList in einer Klasse erstellen
Schreib die Klasse mal als richtige Klasse, in der die StringList als Feld implementiert ist und erzeuge diese im Konstruktor der Klasse. Zerstören dann natürlich im Destruktor.
Schau dir dann erstmal an, wie das Ergebnis dann aussieht und dann sehen wir weiter. |
Re: Eine StringList in einer Klasse erstellen
Hier ist das Stück code mit dem ich das RichEdit befülle:
Delphi-Quellcode:
Edit.Lines.Assign(ScrollList);
|
Re: Eine StringList in einer Klasse erstellen
@spaxxn: soein Class-Object ist eigentlich recht praktisch ... das ist quasi wie eine Sammlung einzelner Prozeduren.
@AnyKey: eigentlich wollte ich grad erwähnen, daß wir garnicht wissen wie du nun diese Klasse verwendest (erstellen, laden und auslesen) aber auch an der grad geposteten Zeile weiß immernoch keiner, wie du die aiszulesende Stringliste erstellt/gefüllt hast. z.B. wenn ScrollList noch nicht erstellt wurde, dann ist zufällig/praktischer Weise diese Variable NIL und demnach ließt Assign nichts ein. |
Re: Eine StringList in einer Klasse erstellen
Hallo,
bitte bitte mal den ganzen Quelltext zeigen. Meine Befürchtung ist, dass die Reihenfolge von Erstellen der Stringliste, dem Löschen der Stringliste, dem Bearbeiten des Textes und/oder der Zuweisung zum RichEdit irgendwo "strubbelig" wird. Leider ist aber aus dem bisher bekanntgegebenen Quelltext nicht zu erahnen, ob diese Vermutung richtig sein könnte. Funktioniert z. B. dasda?
Delphi-Quellcode:
Edit.Lines.Text := ScrollList.Text;
|
Re: Eine StringList in einer Klasse erstellen
@himitsu: Praktisch ist vieles, aber saubere Programmierung sieht anders aus, oder?
|
Re: Eine StringList in einer Klasse erstellen
Zitat:
Ich würe es eine sauber getrennte Angelegenheit nennen ... ganz nach dem OOP-Motto alles schön gekapselt :angel2: (PS: so läßt sich auch gut die Autovervollständigung von Delphi nutzen um zusammengehörige Funktionen/Prozeduren zu finden/aufzulisten, da sie ja alle schön in einer "Klasse" drinstecken) Abgesehn davon, daß ich meine TXHelper-Klasse im himXML, welche praktisch auch soetwas darstelt, zusätzlich noch als "Class Abstract" definiert hab, damit kann nun a) keiner eine "sinnlose" Instanz davon erstellen und b) jeder weiß, daß man davon keine Instanz erstellen soll. Um nicht ganz OT zu werden: Hab praktisch die selbe Beführtchtung wie du. :angel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 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