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 TList (https://www.delphipraxis.net/28236-tlist.html)

semo 21. Aug 2004 18:25


TList
 
ich habe folgendes Problem: ich importiere aus Excel eine Liste an Daten folgendermaßen:

1. lese jede Zeile ein und packe die Inhalte in eine StringList
2. die StringListe packe ich in eine TList
3. die TList will ich dann auslesen

dabei tritt dann bei fehler bei folgender zuweisung auf:
ExcelZeile := TStringList(Schilder.Items[0]);

Was mache ich falsch?


hier der Quelltext:
Code:
private
  { Private-Deklarationen }
    ExcelZeile: TStringList;
    Schilder: TList;
...


procedure TMainForm.ButtonExcelImportClick(Sender: TObject);
var
  schildZeile: TLabel;
  i: Integer;
begin
  OpenDialog.Filter := 'Excel Tabelle(*.xls)|*.xls';
  if OpenDialog.Execute then
  begin
    Schilder  := TList.Create;

    // Excelzeilen einlesen
    ladeZeilen(OpenDialog.Filename);

    ShowMessage(IntToStr(Schilder.Count) + ' Zeilen aus der Excel Tabelle eingelesen');

    // die Zeilen des ersten Schildes anzeigen
    ExcelZeile := TStringList(Schilder.Items[0]);
    ShowMessage('Anzahl der Felder in der StringList:' + #13#10 +
                IntToStr(ExcelZeile.Count));
    for i:=0 to ExcelZeile.Count-1 do
    begin
      schildZeile := TLabel.Create(Gravurflaeche);
      with schildZeile do
      begin
        Parent := Gravurflaeche;
        Visible := true;
        Left   := 10;
        Top    := i*14 + 10;
        Text   := ExcelZeile.ValueFromIndex[i];
        ShowMessage(ExcelZeile.ValueFromIndex[i]);
        Name   := 'Label' + IntToStr(i);
      end;
    end;
    ExcelZeile.Free;
  end;
end;

paelesoft 21. Aug 2004 18:28

Re: TList
 
Zitat:

Zitat von computer-glossar.de
dabei tritt dann bei fehler bei folgender zuweisung auf:

Wie heißt der Fehler? (index oder so?)

semo 21. Aug 2004 18:31

Re: TList
 
zugriffsverletzung

Luckie 21. Aug 2004 18:32

Re: TList
 
Hast du die Stringliste auch irgendwo erzeugt?

semo 21. Aug 2004 18:38

Re: TList
 
mache ich doch mit dieser anweisung:

Code:
ExcelZeile := TStringList(Schilder.Items[0]);

Kernel32.DLL 21. Aug 2004 19:24

Re: TList
 
erzeugt man 'ne Stringlist nicht normalerweise mit:

Delphi-Quellcode:
var
Stringlist: TStringlist;

[...]

Stringlist := TStringlist.create;

Chewie 21. Aug 2004 19:33

Re: TList
 
Zeig uns doch bitte mal die Prozedur LadeZeilen. Denn dort wird (hoffentlich) Schilder gefüllt, was für das Verständnis notwendig ist.

semo 21. Aug 2004 19:42

Re: TList
 
Code:
procedure TMainForm.ladeZeilen(excelFilename: String);
var
  myExcel, Sheet: OLEVariant;
  zeile, spalte, lastRow: Integer;
  index: Integer;
  tempStringList: TStringList;
begin
  if excelFilename <> '' then
  begin
    try
      // Create Excel-OLE Object
      myExcel := CreateOleObject('Excel.Application')
    except
      ShowMessage('Excel konnte nicht gestartet werden!');
      exit
    end;

    // Excel verbergen
    myExcel.Visible := false;

    // Öffnen der gewählten Arbeitsmappe
    myExcel.Workbooks.Open(excelFilename);

     Sheet := myExcel.Workbooks[1].WorkSheets[1];
    //Sheet := myExcel.Workbooks[ExtractFileName(excelFilename)].WorkSheets[1];

    // die letzte nicht leere Zelle aktivieren
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    // ich muss jede Zeile einlesen und jede Zeile kann unterschiedlich viel Spalten haben
    // von 1 bis lastRow eine For-Schleife durchlaufen
    // lastCol pro Zeile in der Schleife ermitteln
    // --> die einzelnen Zellinhalt in ein Array packen
    // --> das Array (entspricht dem kompletten Inhalt einer Zeile) in eine Liste packen
    lastRow := myExcel.ActiveCell.Row;

    tempStringList := TStringList.Create;
    for zeile := 1 to lastRow do
    begin
      spalte := 1;
      tempStringList.Clear;
      while (myExcel.Cells[zeile, spalte].Value <> '') do
      begin
        //SetLength(ArrOfZeilen, spalte); // Arraylänge erhöhen
        //ArrOfZeilen[spalte-1] := myExcel.Cells[zeile, spalte].Value;
        index := tempStringList.Add(myExcel.Cells[zeile, spalte].Value);
        {ShowMessage('Zeile: ' + IntToStr(zeile) + #13#10 +
                    'Spalte: ' + IntToStr(spalte) + #13#10 +
                    'Value: ' + myExcel.Cells[zeile, spalte].Value + #13#10 +
                    'index in Excelzeile: ' + IntToStr(index));
        }
        Inc(spalte);
      end;
      Schilder.Add(tempStringList);
      Caption := IntToStr(Schilder.Count);
    end;

    // Quit Excel
    if not VarIsEmpty(myExcel) then
    begin
      myExcel.DisplayAlerts := False;
      myExcel.Quit;
      myExcel := Unassigned;
      Sheet  := Unassigned;
    end ;
    tempStringList.Free
  end;
end;

Kernel32.DLL 21. Aug 2004 19:48

Re: TList
 
Also, ihr könnt mich ja für blöde erklären, aber mein:

Code:
ExcelZeile := TStringList.Create;
habe ich immer noch nicht gefunden!

Das brauch' man doch, oder?

*Weltanschauung durcheinander werf*

semo 21. Aug 2004 19:53

Re: TList
 
ich habe das mal so gelernt dass man die ein Objekt erzeugen kann wenn man das Item einer TList unter Angabe des Objekttypes zuweist, sind ja nur pointer die da zugewiesen werden

stringListe := TStringList(List.Items[0]);


folgendes bringt mich nämlich auch nicht weiter:
Code:
ExcelZeile := TStringList.Create;
// die Zeilen des ersten Schildes anzeigen
ExcelZeile := Schilder.Items[0];
:gruebel:

Kernel32.DLL 21. Aug 2004 19:59

Re: TList
 
Hmm....

Das kann natürlich sein...

Vielleicht versuchst du es trotzdem mal?

Naja, ich werde mich die nächsten Tage sowieso mit Stringliste auseinander setzen müssen...


=> 100. Beitrag :cheers: <=

[Edit] Da war wohl jemand am bearbeiten, als ich geschrieben hab :mrgreen: [/Edit]

semo 21. Aug 2004 20:01

Re: TList
 
habe ich doch probiert.... wie könnte ich sonst wissen das es nicht funktioniert? :roll:

Kernel32.DLL 21. Aug 2004 20:06

Re: TList
 
Wie gesagt:

Zitat:

[Edit] Da war wohl jemand am bearbeiten, als ich geschrieben hab [/Edit]
Das war, als ich den Post las, nämlich noch nicht da:

Delphi-Quellcode:
ExcelZeile := TStringList.Create;
// die Zeilen des ersten Schildes anzeigen
ExcelZeile := Schilder.Items[0];
So, nu können wir wieder zurück zum Topic :zwinker:

semo 21. Aug 2004 20:08

Re: TList
 
ok ok .. sorry ;)
hatte ich nachträglich angefügt....

Kernel32.DLL 21. Aug 2004 20:10

Re: TList
 
no prob :mrgreen:

Chewie 21. Aug 2004 20:42

Re: TList
 
Du machst folgendes: In deine TList-Instanz fügst du Referenzen auf das TStringList-Objekt hinzu. Danach gibst du dieses Objekt wieder frei. Das passiert in der LadeZeilen-Prozedur. In der anderen Prozedur gehst du nun hin und castest das erste Element der Liste als TStringList und greifst drauf zu. Wär ja soweit OK, nur dass du das Objekt, auf das du zugreifst, vorher schon freigibst!
Falls dus nicht wusstest: Eine Variable vom Typ einer Klasse ist nicht das Objekt selbst, sondern nur eine Referenz, also ein Zeiger, darauf. Eine Zuweisung der Art
Delphi-Quellcode:
var
  obj1, obj2: TObject;
begin
  obj1 := obj2;
end;
kopiert nicht das Objekt, sondern nur einen Zeiger!

semo 21. Aug 2004 21:13

Re: TList
 
eigentlich ist mir das schon klar :gruebel:


so funzt es natürlich:


in procedure ladeZeilen
Code:
for zeile := 1 to lastRow do
    begin
      spalte := 1;
      ExcelZeile := TStringList.Create;
      while (myExcel.Cells[zeile, spalte].Value <> '') do
      begin
        index := ExcelZeile.Add(myExcel.Cells[zeile, spalte].Value);
        Inc(spalte);
      end;
      Schilder.Add(ExcelZeile);
      Caption := IntToStr(Schilder.Count);
    end;
ne neue StringListe für jede Excelzeile anlegen... die in die TList laden.

in der anderen procedure mit arbeiten und dann bei bedarf alle items (stringlisten) der TList wieder freigeben


thx auf diesem wege :cheers:


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