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)
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