AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TListView

Ein Thema von Programirl · begonnen am 7. Jan 2019 · letzter Beitrag vom 8. Jan 2019
Antwort Antwort
Programirl

Registriert seit: 7. Jan 2019
4 Beiträge
 
#1

TListView

  Alt 7. Jan 2019, 18:01
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:
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;
Da ich die ListView mit den Spalten und Spaltenüberschriften über das Formular erstellt habe, brauch ich wohl dafür keinen Create.

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?

Geändert von mkinzler ( 7. Jan 2019 um 18:05 Uhr) Grund: Delphi-Tags eingefügt
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#2

AW: TListView

  Alt 7. Jan 2019, 18:12
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).
  Mit Zitat antworten Zitat
Programirl

Registriert seit: 7. Jan 2019
4 Beiträge
 
#3

AW: TListView

  Alt 7. Jan 2019, 18:21
Wenn ich listView1: TListView; aus dateiladen entferne, sagt der Compiler:
Identifier not found "ListView1".

So läuft das Programm:

Delphi-Quellcode:
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;
Ist halt nur nicht das was ich wollte.

Geändert von Programirl ( 7. Jan 2019 um 18:59 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#4

AW: TListView

  Alt 7. Jan 2019, 18:22
Bitte Quelltext ändern:

Unter procedure HalleClick(Sender: TObject); bitte procedure dateiladen(dateiname: string); einfügen.

Das vorhandene procedure dateiladen(dateiname: string); ändern in procedure TmainFrm.dateiladen(dateiname: string); In der procedure dateiladen bitte die Zeile ListView1: TListView; entfernen.

application.terminate; durch Close; ersetzen.
  Mit Zitat antworten Zitat
Programirl

Registriert seit: 7. Jan 2019
4 Beiträge
 
#5

AW: TListView

  Alt 7. Jan 2019, 18:27
Bitte Quelltext ändern:

Unter procedure HalleClick(Sender: TObject); bitte procedure dateiladen(dateiname: string); einfügen.

Das vorhandene procedure dateiladen(dateiname: string); ändern in procedure TmainFrm.dateiladen(dateiname: string); In der procedure dateiladen bitte die Zeile ListView1: TListView; entfernen.

application.terminate; durch Close; ersetzen.

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?
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#6

AW: TListView

  Alt 7. Jan 2019, 18:34
Ja,
  Mit Zitat antworten Zitat
Programirl

Registriert seit: 7. Jan 2019
4 Beiträge
 
#7

AW: TListView

  Alt 7. Jan 2019, 18:39
Na da bin ich aber froh
Vielen Dank für die schnelle Hilfe!
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#8

AW: TListView

  Alt 7. Jan 2019, 21:27
Hmm..

Oder anders:

Delphi-Quellcode:
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;
(Nur so runtergetippt, ohne korrekturen mit Try...)
  Mit Zitat antworten Zitat
8. Jan 2019, 06:08
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.
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:49 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