Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage) (https://www.delphipraxis.net/173357-uebergabe-von-tstring-s-list-aus-unit-eine-andere-anfaengerfrage.html)

Drosera 19. Feb 2013 15:43

Ü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:
procedure TsqdForm.createMusicTabs();
 var
    anzahlItems : integer;
    tabListe : TStrings;
 begin
   // (leseAbschnittsKeys('musik'));
   tabListe := TStringList.Create;
      tabListe.AddStrings(verzeichnisHandlingUnit.leseAbschnittsKeys('musik'));
 end;
Sendende Unit:
Delphi-Quellcode:
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;
(nur nebenbei: Der Abschnittsname musik existiert und hat Daten)

Kann mir jmd. auf die Sprünge helfen??

Popov 19. Feb 2013 16:00

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:
interface

  procedure MyList(List: TStrings);

implementation

procedure MyList(List: TStrings);
begin
  List.Clear;
  List.AddStrings(Screen.Fonts);
end;
Unit1
Delphi-Quellcode:
uses
  Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyList(ListBox1.Items);
end;
Das klappt.

Unit1
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    MyList(sl);
    ShowMessage(sl.Text);
  finally
    sl.Free;
  end;
end;
Das klappt auch.

Was machst du also anders?

Popov 19. Feb 2013 16:08

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.

Drosera 19. Feb 2013 16:13

@Popow
 
Danke für die Info, hab' mich schon gefragt wie das geht (den Code optisch absetzten)

Drosera 19. Feb 2013 16:38

@Popow (nochmal...)
 
Danke Dir vielmals!

Da hast Du mir auf die Sprünge geholfen. :thumb:

p80286 19. Feb 2013 16:39

AW: Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage)
 
[QUOTE=Drosera;1204343]
Delphi-Quellcode:
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;
und wenn es schon eine Funktion sein muß dan vllt. so:
Delphi-Quellcode:
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;
Gruß
K-H

Popov 19. Feb 2013 16:54

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:
function leseAbschnittsKeys(...):TStrings;
...
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.

Noch paar Tipps.

Delphi-Quellcode:
      namensListe := TStringList.Create;
       namensListe.Clear;
Das Clear kannst du dir sparen. Eine neu erstellte Liste ist ja leer.

Delphi-Quellcode:
      finally
        namensListe.Clear;
Sollte das evtl ein .Free sein?

Delphi-Quellcode:
        leseAbschnittsKeys := iniFile.ReadSections(namensListe);
Nicht falsch, aber Result := statt leseAbschnittsKeys := ist evtl. übersichtlicher.

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.

Popov 19. Feb 2013 17:09

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:
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;
Wie gesagt, nicht getestet, hier im Editfeld umgeschrieben.

DeddyH 19. Feb 2013 17:23

AW: Übergabe von TString-s(-List) aus Unit an eine andere (Anfängerfrage)
 
Der Fehler war übrigens hier:
Zitat:

Delphi-Quellcode:
leseAbschnittsKeys := iniFile.ReadSections(namensListe);

ReadSections ist eine Prozedur, man kann sie also keinem TStrings-Objekt zuweisen. Wenn, dann hätte man namensListe zurückgeben müssen, aber das ist wie erwähnt alles andere als empfehlenswert.


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