![]() |
TListView
Hallo zusammen,
ich bin gerade dabei mich in Delphi einzuarbeiten (Lazarus) und habe damit begonnen ein Formular mit einer TListView zu erstellen, die Inhalte aus einer .csv Datei anzeigen soll. Dazu gibt's einen Button der auf Klick eben die Inhalte aus der csv ausliest. Dieses Auslesen und Hinzufügen möchte ich mehrfach verwenden (gibt später noch andere Buttons), daher habe ich dafür eine eigene procedure erstellt. Aber irgendwo habe ich noch einen Fehler, es läuft nicht. Such jetzt schon so lange aber finde es nicht. Der Compiler sagt: unit1.pas(90,22) Warning: Local variable "ListView1" does not seem to be initialized Nach dem Klick auf besagten Button wird als Fehler ausgegeben: "Projekt ... hat Exception-Klasse "External: SIGSEGV" ausgelöst. In Datei '.include/listitems.inc' in Zeile 94" Da heißt's:
Delphi-Quellcode:
{------------------------------------------------------------------------------}
{ TListItems Add } {------------------------------------------------------------------------------} function TListItems.Add: TListItem; begin // Zeile 94: if Assigned(Owner) then Result := Owner.CreateListItem else Result := TListItem.Create(Self); AddItem(Result); end; Mein Code schaut wie folgt aus:
Delphi-Quellcode:
Da ich die ListView mit den Spalten und Spaltenüberschriften über das Formular erstellt habe, brauch ich wohl dafür keinen Create.
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Grids, ComCtrls; type { TmainFrm } TmainFrm = class(TForm) Beenden: TButton; Halle: TButton; ListView1: TListView; procedure BeendenClick(Sender: TObject); procedure HalleClick(Sender: TObject); private public end; var mainFrm: TmainFrm; implementation {$R *.lfm} type TStrArray = array of string; var dateiname: string; function explode...... end; procedure dateiladen(dateiname: string); var ListView1: TListView; list: TStringList; listItem: TListItem; x, ItemCount: Integer; a: TStrArray; begin list:=TStringList.Create; list.Clear; list.LoadFromFile(dateiname); itemCount:=list.Count; // listView1.Items.Clear; for x:=0 to itemCount-1 do begin Explode(a,';',list.Strings[x]); listItem:=ListView1.Items.Add; listItem.Caption:=a[0]; listItem.SubItems.Add(a[1]); listItem.SubItems.Add(a[2]); listItem.SubItems.Add(a[3]); end; list.free; end; { TmainFrm } procedure TmainFrm.BeendenClick(Sender: TObject); begin application.terminate; end; procedure TmainFrm.HalleClick(Sender: TObject); var dateiname: string; begin dateiname:='C:\Users\pfad_dateiname'; dateiladen(dateiname); end; Wenn ich listView1.Items.Clear; rein tu, dann läufts auch nicht: "Projekt ... hat Exception-Klasse "External: SIGSEGV" ausgelöst. In Datei 'unit1.pas' in Zeile 84: listView1.Items.Clear;" Wo hab ich jetzt den Hund? :? |
AW: TListView
listview1 ist aber nicht das Listview, das Du im Designer erstellt hast, sondern die lokale Variable. Und die ist nicht initialisiert, wie die Meldung schon sagt.
Entferne "ListView1: TListView" aus dateiladen... ist das eine Klassenmethode, die du nur in Kurzschreibweise hier anders geschrieben hast? Sonst muss sie auf das Formular verweisen (mainFrm.listview1). |
AW: TListView
Wenn ich listView1: TListView; aus dateiladen entferne, sagt der Compiler:
Identifier not found "ListView1". So läuft das Programm:
Delphi-Quellcode:
Ist halt nur nicht das was ich wollte.
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Grids, ComCtrls; type { TmainFrm } TmainFrm = class(TForm) Beenden: TButton; Halle: TButton; ListView1: TListView; procedure BeendenClick(Sender: TObject); procedure HalleClick(Sender: TObject); private public end; var mainFrm: TmainFrm; implementation {$R *.lfm} type TStrArray = array of string; var dateiname: string; function explode..... end; //procedure dateiladen(dateiname: string); //end; { TmainFrm } procedure TmainFrm.BeendenClick(Sender: TObject); begin application.terminate; end; procedure TmainFrm.HalleClick(Sender: TObject); var //ListView1: TListView; list: TStringList; listItem: TListItem; x, ItemCount: Integer; a: TStrArray; begin dateiname:='C:\Users\pfad_dateiname'; list:=TStringList.Create; list.Clear; list.LoadFromFile(dateiname); itemCount:=list.Count; ListView1.Items.Clear; for x:=0 to itemCount-1 do begin Explode(a,';',list.Strings[x]); listItem:=ListView1.Items.Add; listItem.Caption:=a[0]; listItem.SubItems.Add(a[1]); listItem.SubItems.Add(a[2]); listItem.SubItems.Add(a[3]); end; list.free; end; |
AW: TListView
Bitte Quelltext ändern:
Unter
Delphi-Quellcode:
bitte
procedure HalleClick(Sender: TObject);
Delphi-Quellcode:
einfügen.
procedure dateiladen(dateiname: string);
Das vorhandene
Delphi-Quellcode:
ändern in
procedure dateiladen(dateiname: string);
Delphi-Quellcode:
In der
procedure TmainFrm.dateiladen(dateiname: string);
Delphi-Quellcode:
bitte die Zeile
procedure dateiladen
Delphi-Quellcode:
entfernen.
ListView1: TListView;
Delphi-Quellcode:
durch
application.terminate;
Delphi-Quellcode:
ersetzen.
Close;
|
AW: TListView
Zitat:
Ah, okay. Jetzt geht das. Ich muss mich mit der procedure auf das Formular beziehen. Und ich dachte, das müsste ich nur direkt bei den Komponenten die sich auf dem Formular befinden. Bei der Explode Funktion brauch ich das nicht weil die keine Komponenten anspricht. Versteh ich das richtig? |
AW: TListView
Ja,
|
AW: TListView
Na da bin ich aber froh :lol:
Vielen Dank für die schnelle Hilfe! |
AW: TListView
Hmm..
Oder anders:
Delphi-Quellcode:
(Nur so runtergetippt, ohne korrekturen mit Try...)
procedure dateiladen(AListView: TListView; dateiname: string);
var list: TStringList; listItem: TListItem; x, ItemCount: Integer; a: TStrArray; begin list:=TStringList.Create; list.Clear; list.LoadFromFile(dateiname); itemCount:=list.Count; // listView1.Items.Clear; for x:=0 to itemCount-1 do begin Explode(a,';',list.Strings[x]); listItem:=AListView.Items.Add; listItem.Caption:=a[0]; listItem.SubItems.Add(a[1]); listItem.SubItems.Add(a[2]); listItem.SubItems.Add(a[3]); end; list.free; end; procedure TmainFrm.HalleClick(Sender: TObject); var dateiname: string; begin dateiname:='C:\Users\pfad_dateiname'; dateiladen(ListView1, dateiname); end; |
Dieses Thema wurde am "08. Jan 2019, 07:08 Uhr" von "Luckie" aus dem Forum "Programmieren allgemein" in das Forum "GUI-Design mit VCL / FireMonkey / Common Controls" verschoben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 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