Delphi-PRAXiS

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/)
-   -   Delphi Eine StringList in einer Klasse erstellen (https://www.delphipraxis.net/140385-eine-stringlist-einer-klasse-erstellen.html)

AnyKey 17. Sep 2009 08:42


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:
class procedure TStringManipulation.ScrollListCreate(Dateiname: String);
begin
  ScrollList := TStringList.Create;
  ScrollList.LoadFromFile(Dateiname);
end;


class procedure TStringManipulation.ScrollListDestroy;
begin
  FreeAndNil(ScrollList);
end;
Wäre super wenn ihr mir helfen könntet!

-> Edit: Ok, bei der Create Funktion ist es im moment noch so dass ich den Inhalt aus einer Datei bekomme... :)

Gruß
AnyKey

mkinzler 17. Sep 2009 08:49

Re: Eine StringList in einer Klasse erstellen
 
Wo ist die Stringliste deklariert? Als Member?
Warum Klassenmethode?

spaxxn 17. Sep 2009 08:50

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...

Klaus01 17. Sep 2009 08:51

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:
TStringManipulation.putContent(lines: TStrings);
begin
  lines.assign(srollist);
end;
(ungetestet)

Aufruf in etwas so:

Delphi-Quellcode:
putContent(DeinRichedit.lines);
Grüße
Klaus

AnyKey 17. Sep 2009 09:22

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

spaxxn 17. Sep 2009 09:24

Re: Eine StringList in einer Klasse erstellen
 
Ist von TStringManipulation ein Objekt instanziert? Also zu dem Zeitpunkt zu dem die Stringlist instanziert werden soll?

AnyKey 17. Sep 2009 09:28

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;

himitsu 17. Sep 2009 09:36

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.

spaxxn 17. Sep 2009 09:40

Re: Eine StringList in einer Klasse erstellen
 
Nicht schön, aber selten :)

AnyKey 17. Sep 2009 09:51

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

himitsu 17. Sep 2009 09:54

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:

spaxxn 17. Sep 2009 10:36

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.

AnyKey 17. Sep 2009 10:39

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

DeddyH 17. Sep 2009 10:45

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?)

spaxxn 17. Sep 2009 10:46

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.

AnyKey 17. Sep 2009 10:54

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);

himitsu 17. Sep 2009 11:11

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.

nahpets 17. Sep 2009 11:15

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;

spaxxn 17. Sep 2009 11:17

Re: Eine StringList in einer Klasse erstellen
 
@himitsu: Praktisch ist vieles, aber saubere Programmierung sieht anders aus, oder?

himitsu 17. Sep 2009 11:37

Re: Eine StringList in einer Klasse erstellen
 
Zitat:

Zitat von spaxxn
@himitsu: Praktisch ist vieles, aber saubere Programmierung sieht anders aus, oder?

Wieso?

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