Listview mit Checkbox

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Listview mit Checkbox

Beitragvon Aphadias » 3. Aug 2017, 16:48 Listview mit Checkbox

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
Aphadias
 
Beiträge: 85
Registriert: 28. Okt 2015, 18:28

Beitragvon Mathias » 3. Aug 2017, 18:58 Re: Listview mit Checkbox

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3047
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Aphadias » 4. Aug 2017, 18:49 Re: Listview mit Checkbox

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: 85
Registriert: 28. Okt 2015, 18:28

Beitragvon Aphadias » 5. Aug 2017, 08:15 Re: Listview mit Checkbox

Also eine "einfache" Lösung wäre wenn man true oder false abfängt und das ausgibt als
Code: Alles auswählen
' '
bzw
Code: Alles auswählen
'X'
, 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 :?
Aphadias
 
Beiträge: 85
Registriert: 28. Okt 2015, 18:28

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Baidu [Spider] und 2 Gäste

porpoises-institution
accuracy-worried