Listview mit Checkbox

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Listview mit Checkbox

Beitrag von Aphadias »

moin da bin ich mal wieder :roll:

ich wollte jetzt gerne mal einen boolischen Wert als Checkbox in eine listview einfügen. Zumindestens ein Häkchen bzw keins. Ich habe eine Datenbank wo ein boolischer wert abgespeichert wird und der gleichzeitig beim schreiben in die DB geschrieben wird und in die Listview. Beim normalen starten soll die DB ausgelesen werden und auch direkt in die Listview gelesen werden. Ich hoffe soweit verständlich. Meine Listview ist ein vsReport und habe Checkbox auf enable.

habe eine prozedure zum speichern angelegt:

Code: Alles auswählen

procedure listviewspeichern(id,mk,name,pk,datum,austrag:String);
begin
   with Fmedibuch.ListView1.Items.Add do begin
   Caption:=id;
   SubItems.Add(mk);
   SubItems.Add(name);
   SubItems.Add(pk);
   SubItems.Add(datum);
   SubItems.Add(austrag);
   end;
end;


zum speichern in die DB und LV habe ich diese procedure:

Code: Alles auswählen

procedure TFMedibuch.ueberClick(Sender: TObject);
begin
  Fstart.querymat.SQL.Clear;
  Fstart.querymat.Params.Clear;
 
  Fstart.querymat.Params.CreateParam(ftString,'mk',ptInputOutput);
  Fstart.querymat.Params.CreateParam(ftString,'name',ptInputOutput);
  Fstart.querymat.Params.CreateParam(ftString,'pk',ptInputOutput);
  Fstart.querymat.Params.CreateParam(ftString,'datum',ptInputOutput);
  Fstart.querymat.Params.CreateParam(ftString,'austrag',ptInputOutput);
 
  Fstart.querymat.ParamByName('mk').Text:=mk.Text;
  Fstart.querymat.ParamByName('name').Text:=name.Text;
  Fstart.querymat.ParamByName('pk').Text:=pk.Text;
  Fstart.querymat.ParamByName('datum').AsDate:=strtodate(label1.Caption);
  Fstart.querymat.ParamByName('austrag').AsBoolean:=austrag.Checked;
 
  if bearbeiten=true then
    begin
      id:=ListView1.Selected.Caption;
 
      Fstart.querymat.SQL.Text:='update medibuch set mk=:mk,'+
                                                 'name=:name,'+
                                                 'pk=:pk,'+
                                                 'datum=:datum,'+
                                                 'datum1=:datum1,'+
                                                 'austrag=:austrag where id='+#39+id+#39;
      Fstart.querymat.ExecSQL;
 
      ListView1.Selected.SubItems[0]:=mk.Text;
      ListView1.Selected.SubItems[1]:=name.Text;
      ListView1.Selected.SubItems[2]:=pk.Text;
      ListView1.Selected.SubItems[4]:=booltostr(austrag.Checked);
 
    end
    else
    begin
      Fstart.querymat.SQL.Text:='insert into medibuch (mk,name,pk,datum,austrag)'+
                                         'values (:mk,:name,:pk,:datum,:austrag)';
 
      Fstart.querymat.ExecSQL;
 
      Fstart.querymat.SQL.Clear;
      Fstart.querymat.Params.Clear;
 
      Fstart.querymat.SQL.Text:='select last_insert_rowid() as id from medibuch';
      Fstart.querymat.Open;
          id:=Fstart.querymat.FieldByName('id').AsString;
      Fstart.querymat.Close;
 
 
 
      listviewspeichern(id,mk.Text,name.Text,pk.Text,label1.Caption,booltostr(austrag.Checked));
 
 
    end;
 
 
 
  clear;
 
  disable;
  abort.Enabled:=false;
  ueber.Enabled:=false;
  change.Enabled:=true;
  save.Enabled:=true;
  deleted.Enabled:=true;
end


und beim öffnen soll das passieren:

Code: Alles auswählen

procedure TFMedibuch.FormCreate(Sender: TObject);
var
  filename: String;
  ini: TIniFile;
begin
  filename := ExtractFilePath(ParamStr(0)) + 'einstellungen.ini';
  if FileExists(filename) then
  begin
  Fstart.conmat.LibraryLocation:=ExtractFilePath(ParamStr(0)) + 'sqlite3.dll';
  ini := TIniFile.Create(filename);
    try
    Fstart.conmat.Database:=Ini.ReadString('BORDPERS', 'Pfad', '');
    finally
      ini.free
    end;
  Fstart.conmat.Connected:=true;
 
  Fstart.querymat.SQL.Clear;
  Fstart.querymat.Params.Clear;
  Fstart.querymat.SQL.Text:='select * from medibuch';
  Fstart.querymat.Open;
  while not Fstart.querymat.EOF do
   begin
     listviewspeichern(Fstart.querymat.FieldByName('id').AsString,Fstart.querymat.FieldByName('mk').AsString,Fstart.querymat.FieldByName('name').AsString,Fstart.querymat.FieldByName('pk').AsString,Fstart.querymat.FieldByName('datum').AsString,booltostr(Fstart.querymat.FieldByName('austrag').AsBoolean));
 
     Fstart.querymat.Next;
   end;
  Fstart.querymat.Close;
  bearbeiten:=false;
  end;
end;


hier

Code: Alles auswählen

booltostr(Fstart.querymat.FieldByName('austrag').AsBoolean)
wollte ich nur mal schauen ob es einen unterschied macht zwischen AsString und AsBoolean.

Problem jetzt in der DB ist ein Datensatz der wird beim Öffnen nicht geladen und beim Speichern haut er völlig zusammen und kann mit dem Fehler nix anfangen.

Fehler:

Projekt sanm hat Exception-Klasse External SIGSEGV ausgelößt. In Datei "include\customviewlist.inc" in Zeile 378

Code: Alles auswählen

FCanvas.TextOut(ARect.Left + 2, ARect.Top, AItem.Caption); 


im ganzen code

Code: Alles auswählen

procedure TCustomListView.DrawItem(AItem: TListItem; ARect: TRect;
  AState: TOwnerDrawState);
begin
  if Assigned(FOnDrawItem) then FOnDrawItem(Self, AItem, ARect, AState)
  else
  begin
    FCanvas.FillRect(ARect);
    FCanvas.TextOut(ARect.Left + 2, ARect.Top, AItem.Caption);
  end;
end;


wieso draw item? wenn ich ein bool umwanlde müsste doch theoretisch 1 od 0 da stehen... bzw hat er durch den click auf checkbox keine checkbox? braucht er da ein bild oder sowas?

würde mich über eure hilfe wieder freuen :D

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview mit Checkbox

Beitrag von Mathias »

wenn ich ein bool umwanlde müsste doch theoretisch 1 od 0 da stehen...

Das ist nicht so, bei False ist ein Boolean immer 0, aber bei True kann er einen x-beliebiger Wert haben.

Bei dieser Funktion kommt eine -1 .

Code: Alles auswählen

 Caption := BoolToStr(True);   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Listview mit Checkbox

Beitrag von Aphadias »

ok dann müsste ich also beim Lesen wie beim Schreiben den boolwert immer abfangen und 0 oder 1 zuweisen. Ist aber auch irgend wie umständlich. Hätte ich ja gleich bei Integer bleiben können.

Aber wie mache ich jetzt in der ListView aus 1 bzw True ein häkchen?

EDIT: Jetzt sehe ich gerade es mit -1 hatte nicht bemerkt das ich einen riesen Fehler in meiner ListView hatte und dadurch wurde nix angezeigt. Was ich jetzt interessantes bemerkt habe.... wird der Wert von der Datenbank gelesen ist es True oder False... wenn ich es direkt in die Listview speichere ist es -1 oder 0.... also muss ich das ja wirklich auf einen nenner bringen

EDIT: achso von meinem Fehler den ich berichtet habe war das ich ausversehen OwnerData angeklickt hatte und er dadurch nix mehr geschrieben hatte bzw es zum Absturz kam

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Listview mit Checkbox

Beitrag von Aphadias »

Also eine "einfache" Lösung wäre wenn man true oder false abfängt und das ausgibt als bzw , weil dann hat man sozusagen ja auch gechecked...

trotzdessen will ich gerne mal wissen warum man Checkbox anklickt und das ding nicht automatisch eine Checkbox hast :?

Antworten