![]() |
Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage)
Moin erstmal und hier eine laaange Beschreibung des Probs!
Problem: Ich erstelle in einer Unit A eine Komponente TStrings und möchte sie in einer Unit B verwenden. Das Problem egal ob ich TStrings oder eine TStringList übergebe, es kommt [Fehler] verzeichnisHandlingUnit.pas(47): Inkompatible Typen: 'TStrings' und 'procedure, untyped pointer or untyped parameter' (Zwischenfrage kann ich eine TStrings.create instantiieren oder muß ich über ein z.B. TStringList.create arbeiten, um auf eine Liste zugreifen zu können?) Hintergrund ist der, daß ich eine Sektion aus einem INI-File auslesen will (wird als StringList zurückgegeben) und eben diese in einer anderen Unit weiterverarbeiten will. Hier mal der Code: Empfangende Unit:
Delphi-Quellcode:
Sendende Unit:
procedure TsqdForm.createMusicTabs();
var anzahlItems : integer; tabListe : TStrings; begin // (leseAbschnittsKeys('musik')); tabListe := TStringList.Create; tabListe.AddStrings(verzeichnisHandlingUnit.leseAbschnittsKeys('musik')); end;
Delphi-Quellcode:
(nur nebenbei: Der Abschnittsname musik existiert und hat Daten)
function leseAbschnittsKeys(abschnittsName : string):TStrings;
var namensListe : TStringList; aktDir : String; begin aktDir := GetCurrentDir()+'\'; iniFile := TIniFile.Create( aktDir + 'sqdplayer.ini' ); try namensListe := TStringList.Create; namensListe.Clear; leseAbschnittsKeys := iniFile.ReadSections(namensListe); finally namensListe.Clear; end; end; Kann mir jmd. auf die Sprünge helfen?? |
AW: Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage)
Also, TStrings ist selbst direkt nicht nutzbar. Sie dient als Basisklasse für andere Klasse, wie z. B. TStringList. Trotz dem kannst du aber TStrigs für die Übergabe nutzten, aber auch nur dafür, d. h. versuche nicht eine Liste draus zu machen wie bei TStringList.
Beispiel: Unit2
Delphi-Quellcode:
Unit1
interface
procedure MyList(List: TStrings); implementation procedure MyList(List: TStrings); begin List.Clear; List.AddStrings(Screen.Fonts); end;
Delphi-Quellcode:
Das klappt.
uses
Unit2; procedure TForm1.Button1Click(Sender: TObject); begin MyList(ListBox1.Items); end; Unit1
Delphi-Quellcode:
Das klappt auch.
procedure TForm1.Button2Click(Sender: TObject);
var sl: TStringList; begin sl := TStringList.Create; try MyList(sl); ShowMessage(sl.Text); finally sl.Free; end; end; Was machst du also anders? |
AW: Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage)
Bitte packe deinen Delphicode in die diese Tags
Code:
.
[DELPHI][/DELPHI]
Einfach auf Bearbeiten klicken, dann vor den Code den Anfang-Tag setzen und nach dem Code den End-Tag setzen. Dann guckt sich das auch jeder an. |
@Popow
Danke für die Info, hab' mich schon gefragt wie das geht (den Code optisch absetzten)
|
@Popow (nochmal...)
Danke Dir vielmals!
Da hast Du mir auf die Sprünge geholfen. :thumb: |
AW: Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage)
[QUOTE=Drosera;1204343]
Delphi-Quellcode:
und wenn es schon eine Funktion sein muß dan vllt. so:
function leseAbschnittsKeys(abschnittsName : string):TStrings;
var namensListe : TStringList; aktDir : String; begin aktDir := GetCurrentDir()+'\'; iniFile := TIniFile.Create( aktDir + 'sqdplayer.ini' ); try namensListe := TStringList.Create; namensListe.Clear; leseAbschnittsKeys := iniFile.ReadSections(namensListe); finally // das namensListe.Clear; // und das ist doch nicht Dein Ernst? end; end;
Delphi-Quellcode:
Gruß
function leseAbschnittsKeys(abschnittsName : string):TStrings;
var namensListe : TStringList; aktDir : String; Myfilename : string; begin aktDir := GetCurrentDir()+'\'; MyFilename:= aktDir + 'sqdplayer.ini' ; namensListe := TStringList.Create; if fileexists(Myfilename) then begin iniFile := TIniFile.Create(MyFilename); iniFile.ReadSections(namensListe); end; result:=namensliste; end; K-H |
AW: Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage)
Unabhängig dessen was bereits p80286 geschrieben hat, ich persönlich mag folgende Funktionen nicht:
Delphi-Quellcode:
Weder weil da etwas falsch ist (ist nicht), sondern weil man da leicht durcheinander kommen kann. Vor allem als Anfänger. Grund: das Create ist in der Funktion, das Free in der aufrufenden Prozedur. Und als ob wir uns abgesprochen hätten, fehlt die Freigabe auch in deinem Code. Guck dir mal mein Beispiel an, zumindest bis das einigermaßen drauf ist.
function leseAbschnittsKeys(...):TStrings;
... Noch paar Tipps.
Delphi-Quellcode:
Das Clear kannst du dir sparen. Eine neu erstellte Liste ist ja leer.
namensListe := TStringList.Create;
namensListe.Clear;
Delphi-Quellcode:
Sollte das evtl ein .Free sein?
finally
namensListe.Clear;
Delphi-Quellcode:
Nicht falsch, aber Result := statt leseAbschnittsKeys := ist evtl. übersichtlicher.
leseAbschnittsKeys := iniFile.ReadSections(namensListe);
Außerdem glaube ich, dass du hier eher die Adresse der iniFile übergibst. Evtl. AddStrings? Und wo wir schon bei iniFile sind, die hast du vergessen wieder freizugeben. |
AW: Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage)
Ohne genau zu wissen was du genau willst, hier eine ungetestete Alternative, falls ich dein Code korrekt verstanden habe:
Delphi-Quellcode:
Wie gesagt, nicht getestet, hier im Editfeld umgeschrieben.
procedure TsqdForm.createMusicTabs();
var anzahlItems : integer; tabListe : TStringList; begin // (leseAbschnittsKeys('musik')); tabListe := TStringList.Create; try leseAbschnittsKeys('musik', tabListe); //mach was mit den Daten finally tabListe.Free; end; end; procedure leseAbschnittsKeys(abschnittsName: string, namensListe: TStrings); var aktDir : String; begin aktDir := GetCurrentDir() + '\'; //alternativ: aktDir := ExtractFilePath(ParamStr(0)); iniFile := TIniFile.Create(aktDir + 'sqdplayer.ini' ); try //soll es ReadSections oder ReadSection sein? Ich gehe vom Fehler aus und somit ReadSection, ohne s iniFile.ReadSection(abschnittsName, namensListe); finally iniFile.Free; end; end; |
AW: Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage)
Der Fehler war übrigens hier:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 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