Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MemoBox bzw. Textdatei im Speicher verwalten (https://www.delphipraxis.net/117553-memobox-bzw-textdatei-im-speicher-verwalten.html)

kuba 20. Jul 2008 23:19


MemoBox bzw. Textdatei im Speicher verwalten
 
Hallo,

ich habe ein Programm geschrieben bei dem ich eine Textdatei in eine MemoBox auslese. Die Daten in der MemoBox kann ich schön schnell verarbeiten weil sie bereits im Speicher sind. Jetzt möchte ich mein Programm Formlos gestalten und kann dann keine MemoBox verwenden.

Kann mir jemand sagen wie ich Speicher deklariere den ich wie eine MemoBox verarbeiten kann ?

Auszug aus meinem Code (100 Werte lesen aus Registry):

Delphi-Quellcode:
procedure 100WerteMinimize;
var
   zaehler  :integer;
   Registry: tRegistry;
   value    :string;
   h        :hwnd;
begin
   for zaehler := 0 to 100 + 1 do
   begin
   Registry := tRegistry.Create;
  Try
    Registry.RootKey := HKEY_LOCAL_MACHINE;;
    Registry.OpenKey ('\Software\KUBA\100Werte', False);
    Value := Registry.ReadString (IntToStr(zaehler));
    Registry.CloseKey;
  Finally
    Registry.Free;
  End;
    PostMessage(GetWindowHandleByExeName(Value), WM_SYSCOMMAND,SC_MINIMIZE,0);
  end;
end;
kuba

PS: ich habe das Programm schon Formlos und schreibe 100 Werte einfach in die Registry, das dauert jedoch zu lange weil ich die Werte ständig verarbeite (prüfe) ...

Blackheart 20. Jul 2008 23:33

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Stringlist

kuba 21. Jul 2008 09:43

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Zitat:

Zitat von Blackheart
Stringlist

Na prima, danke für den Tip ...

Mal konkret - Ich hab die Daten in eine MemoBox eingegeben und von dort aus in die Registry geschrieben. Jetzt suche ich eine Möglichkeit die Daten von der Registry in den Speicher zu laden.

So portiere ich die Daten von der MemoBox in die Registry:

Delphi-Quellcode:
procedure TForm2.Button3Click(Sender: TObject);
var
   zaehler  :integer;
   Registry: tRegistry;
begin
   for zaehler := 0 to 100 + 1 do
   begin
   Registry := tRegistry.Create;
  Try
    Registry.RootKey := HKEY_LOCAL_MACHINE;;
    Registry.OpenKey ('\Software\KUBA\Minimize', False);
    Registry.WriteString (IntToStr(zaehler),Memo1.Lines.Strings[zaehler]);
    Registry.CloseKey;
  Finally
    Registry.Free;
  End;
   end;
   Form2.Close;
end;
Die andere Routine (ganz oben) verwende ich zur Verarbeitung der Daten (Minimize).
Kann mir jemand einen Tip geben wie ich das mit Stringlist einfach lösen kann ?

KUBA

mkinzler 21. Jul 2008 11:01

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Memo.Lines ist eine Stringliste

kuba 21. Jul 2008 11:54

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Zitat:

Zitat von mkinzler
Memo.Lines ist eine Stringliste

ist mir eigentlich auch klar, wie gesagt mein Programm ist Formlos und daher muss ich auf die MemoBox verzichten ...

kuba

Diamondback2007 21. Jul 2008 11:59

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Naja deklariere dir eine Variable vom Typt TStringList.
Dann noch erstellen und du kannst alles machen was du willst.
Am Ende das Freigeben nicht vergessen.

mkinzler 21. Jul 2008 12:09

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Ja dann nimm eine StringListe statt Memo.Lines

Delphi-Quellcode:
var
    sl: TStrings;
    ...
    sl := TStringList.Create;
    ...
    Registry.WriteString (IntToStr(zaehler),sl[zaehler]);

turboPASCAL 21. Jul 2008 12:45

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Ja, eine StringListe.

;) Zum fünften mal... :stupid:

Oder dann doch ein Array of String. :gruebel: :stupid: :wink:

Diamondback2007 21. Jul 2008 12:49

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
[OT]Warum deklarieren hier alle etwas besseren Delphi-Programmierer eine StringListe nur als TStrings? Bringt das was oder ist das wirklich einfach nur kürzer? :mrgreen: [/OT]


Zitat:

Zitat von mkinzler
Ja dann nimm eine StringListe statt Memo.Lines

Delphi-Quellcode:
var
    sl: TStrings;
    ...
    sl := TStringList.Create;
    ...
    Registry.WriteString (IntToStr(zaehler),sl[zaehler]);

Da fehlt noch ein
Delphi-Quellcode:
sl.Free;
:wink:

p80286 21. Jul 2008 12:53

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Zitat:

Zitat von mkinzler

Delphi-Quellcode:
var
    sl: TStrings;
    ...
    sl := TStringList.Create;
    ...

Äh, Tschuldigung, aber TStrings und Tstringlist ist nicht dasselbe, oder vielleicht doch?
Gruß K-H

mkinzler 21. Jul 2008 12:54

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Zitat:

[OT]Warum deklarieren hier alle etwas besseren Delphi-Programmierer eine StringListe nur als TStrings? Bringt das was oder ist das wirklich einfach nur kürzer? Mr. Green [/OT]
TStrings ist der abstrakte Vorgänger von TStringList.

Diamondback2007 21. Jul 2008 13:02

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Zitat:

Zitat von mkinzler
Zitat:

[OT]Warum deklarieren hier alle etwas besseren Delphi-Programmierer eine StringListe nur als TStrings? Bringt das was oder ist das wirklich einfach nur kürzer? Mr. Green [/OT]
TStrings ist der abstrakte Vorgänger von TStringList.

Ich weiß, aber was macht es für einen Sinn bei der Deklaration nicht auch schon den Nachfolger zu deklarieren?
Im Moment sehe ich nur den Sinn, dass TStrings einfach weniger zu schreiben ist. ;) Klärt mich auf wenn ich falsch liege. :)

DeddyH 21. Jul 2008 13:34

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Z.B. TMemo.Lines sind als TStrings deklariert und nicht als TStringList. Deklarierst Du also einen Übergabeparameter als TStringlist, kannst Du TMemo.Lines nicht mehr übergeben, so einfach ist das ;)

p80286 21. Jul 2008 13:47

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Hallo,

da muß ich nun doch wiedersprechen.
Delphi-Quellcode:
var
  ll : tstrings;
begin
  ll:=tstringlist.Create;
  ll.add('einms');
  ll.add('zwei');
  ll.add('dreir');
  ll.add('vier');
  ll.add('fünf');
  ll.sort;        {---- das geht nicht!}
  ll.Free;
end;
Wenn man die StringList sortieren will, oder sonst etwas nutzen will was in TStrings enthalten ist, dann knallt's.
Und die Übergabe geht über .Text ganz gut.

Gruß
K-H

DeddyH 21. Jul 2008 13:50

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Und was willst Du damit zum Ausdruck bringen (vor allem, wem widersprichst Du denn da nun)?

nat 21. Jul 2008 14:07

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Zitat:

Zitat von p80286
Hallo,

da muß ich nun doch wiedersprechen.
Delphi-Quellcode:
var
  ll : tstrings;
begin
  ll:=tstringlist.Create;
  ll.add('einms');
  ll.add('zwei');
  ll.add('dreir');
  ll.add('vier');
  ll.add('fünf');
  ll.sort;        {---- das geht nicht!}
  ll.Free;
end;
Wenn man die StringList sortieren will, oder sonst etwas nutzen will was in TStrings enthalten ist, dann knallt's.
Und die Übergabe geht über .Text ganz gut.

Gruß
K-H

über
Delphi-Quellcode:
TStringList(l1).sort;
würde das dann auch wieder gehen :)

DeddyH 21. Jul 2008 14:13

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Ist zwar in diesem Fall wurscht, aber IMO wäre es besser mit
Delphi-Quellcode:
(ll as TStringList).sort;

p80286 21. Jul 2008 14:30

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Hallo

ich hatte den Eindruck, das sich Kuba mit den Stringlisten ein wenig schwer tut, und dann ist eine eine solche Konstruktion meiner Meinung nach nicht das wahre:

Delphi-Quellcode:
var
  sl : TStrings;

  sl:=TStringlist.create;
Wenn dann irgendwo hinten im Code eine Methode oder eine Eigenschaft von TStringlist genutzt wird, ist Hängen im Schacht. Wenn man nur die Methoden und Eigenschaften von TStrings benötigt, und man ist sich dessen bewusst, ist dies ein gangbarer Weg. Aber dann sollte man nicht von Stringlisten sondern von "deabstrahiertem" (oder wie ach immer das heißt) TStrings sprechen.

Und daß
Delphi-Quellcode:
 
  TStringlist(ll).sort
funktioniert, wußte ich nicht.

Typecasting mit Klassen eröffnet ganz neue Möglichkeiten.

Gruß
K-H

mkinzler 21. Jul 2008 14:34

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Der harte Cast sollte aber, wie Detlef schon erwähnt hat, durch eine Softcast ersetzt werden.
Die Verwendung des abtrakten Vorgängers bei der Variablendeklaration hat weiterhin den Vorteil, dass man später die implementierende lasse einfacher ändern kann. Deshalb wird innerhalb der VCL auch immer TStrings als Typ verwendet.

nat 21. Jul 2008 14:43

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Zitat:

Zitat von mkinzler
Der harte Cast sollte aber, wie Detlef schon erwähnt hat, durch eine Softcast ersetzt werden.
Die Verwendung des abtrakten Vorgängers bei der Variablendeklaration hat weiterhin den Vorteil, dass man später die implementierende lasse einfacher ändern kann. Deshalb wird innerhalb der VCL auch immer TStrings als Typ verwendet.

warum?
in diesem fall weiß ich doch 100%ig von welchem typ mein objekt ist und, dass ich das garantiert zu TStringList casten kann.

mkinzler 21. Jul 2008 14:46

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Ich würde grundsätzlich Fehlerquellen umgehen. In diesem Beispiel ist es sicherlich klar, aber Code wächst und irgendwann ist es nicht mehr so ganz klar. Und eine aussagekräftige Fehlermeldung wg dem ungültigen Cast sagt mehr aus als eine Zugriffsverletzung.

kuba 21. Jul 2008 15:57

Re: MemoBox bzw. Textdatei im Speicher verwalten
 
Wow, den ganzen Morgen habe ich herumgesucht und nix gefunden...

Kaum bin ich ein paar Stunden weg, prasseln die Antworten nur so herunter.

Vielen Dank für die Aufklärung !!

Die angeführten Beispiele bringen mich mit Sicherheit weiter :zwinker:

KUBA

PS: habe meine Software schon fertig, ist aber zu langsam - muss ich nochmal überarbeiten...
Und wie ich jetzt gerade anfange stelle ich fest dass es viel Arbeit ist :roteyes:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:51 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