![]() |
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; |
Re: TList
Zitat:
|
Re: TList
zugriffsverletzung
|
Re: TList
Hast du die Stringliste auch irgendwo erzeugt?
|
Re: TList
mache ich doch mit dieser anweisung:
Code:
ExcelZeile := TStringList(Schilder.Items[0]);
|
Re: TList
erzeugt man 'ne Stringlist nicht normalerweise mit:
Delphi-Quellcode:
var
Stringlist: TStringlist; [...] Stringlist := TStringlist.create; |
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.
|
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; |
Re: TList
Also, ihr könnt mich ja für blöde erklären, aber mein:
Code:
habe ich immer noch nicht gefunden!
ExcelZeile := TStringList.Create;
Das brauch' man doch, oder? *Weltanschauung durcheinander werf* |
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:
:gruebel:
ExcelZeile := TStringList.Create;
// die Zeilen des ersten Schildes anzeigen ExcelZeile := Schilder.Items[0]; |
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] |
Re: TList
habe ich doch probiert.... wie könnte ich sonst wissen das es nicht funktioniert? :roll:
|
Re: TList
Wie gesagt:
Zitat:
Delphi-Quellcode:
So, nu können wir wieder zurück zum Topic :zwinker:
ExcelZeile := TStringList.Create;
// die Zeilen des ersten Schildes anzeigen ExcelZeile := Schilder.Items[0]; |
Re: TList
ok ok .. sorry ;)
hatte ich nachträglich angefügt.... |
Re: TList
no prob :mrgreen:
|
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:
kopiert nicht das Objekt, sondern nur einen Zeiger!
var
obj1, obj2: TObject; begin obj1 := obj2; end; |
Re: TList
eigentlich ist mir das schon klar :gruebel:
so funzt es natürlich: in procedure ladeZeilen
Code:
ne neue StringListe für jede Excelzeile anlegen... die in die TList laden.
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; 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