Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   StringGrid-Problem (https://www.delphipraxis.net/164914-stringgrid-problem.html)

Impulz 6. Dez 2011 07:44

Delphi-Version: 7

StringGrid-Problem
 
Guten Tag,
Erstmal zu meinem Projekt:

Ich habe eine Datenbank mit Kunden,Autoren,Büchern usw. (IBExpert) und habe eine Datenbankoberfläche die ich in Delphi 7 schreibe.
Die Datenbank wird abgerufen und die Daten werden in einem ListView angezeigt. Auf diesem ListView kann man per Rechtsklick Bearbeiten und Löschen der einzelnden Datensätze ausführen, dabei öffnet sich ein Pop-Up Fenster mit einem StringGrid wo dann die ausgewählte Zeile angezeigt wird.
Dort Editiere ich die Daten und reiche diese an den ListView zurück. Soweit so gut.
Doch nun:

Wieso werden die Daten UNTER die alten daten geschrieben????

(BSP: ID Vorname Nachname
1 Max Mustermann
BEARBEITEN:
1 Martin Mustermann
nach dem bearbeiten------>
ID Vorname Nachname
1 Max Mustermann
wenn ich jetzt auf LÖSCHEN gehe.. steht da:

1 Martin Mustermann


Vielen dank schonmal

DeddyH 6. Dez 2011 07:47

AW: StringGrid-Problem
 
Anscheinend machst Du etwas falsch. Mehr kann ich anhand der Fülle des geposteten Codes allerdings nicht dazu sagen.

Impulz 6. Dez 2011 07:51

AW: StringGrid-Problem
 
so siehts im Bearbeiten klich aus:

Code:
rocedure TStartseite.Bea1click(Sender:TObject);
var
  Kunde :Tkunde;
  neuKunde:TKunde;
  neuItem: TListItem;
  Sendung :TSendung;
  neuSendung:TSendung;
  Autor :TAutor;
  neuAutor:TAutor;
  Buch :TBuch;
  neuBuch:TBuch;

begin
  if (rgAuswahl.ItemIndex = 0) then
  begin
    Kunde:= TKunde(lvAuswahl.ItemFocused.SubItems.Objects[1]);
    Dateneditieren.giveKundeDataToGrid(Kunde);
    if IsPositiveResult(Dateneditieren.ShowModal()) then
    begin
      Kunde:= TKunde (Dateneditieren.StrGrAuswahl.Objects[1,2]);
      neuKunde:=TKunde(lvAuswahl.ItemFocused.SubItems.Objects[0]);
      kunde:= neuKunde.Create(neuKunde.ID,neuKunde.Vorname,neuKunde.Nachname);
      lvAuswahl.ItemFocused.SubItems.Add(Dateneditieren.StrGrAuswahl.Cells[1,1]);
      lvAuswahl.ItemFocused.SubItems.Add(Dateneditieren.StrGrAuswahl.Cells[2,1]);
      neuKunde:=TKunde.Create(Kunde.ID,(Dateneditieren.StrGrAuswahl.Cells[1,1]),kunde.nachname);
      neuKunde:=Tkunde(Dateneditieren.StrGrAuswahl.Cells[2,1]);
      connect.KundeTransa.StartTransaction;
      connect.KundeTransa.Commit;
      connect.KundeQuery.CommitUpdates;
    end else
    begin
    IsNegativeResult(Dateneditieren.ShowModal())
    end;
  end else
  if (rgAuswahl.ItemIndex = 1) then
  begin
    sendung:= TSendung(lvAuswahl.ItemFocused.SubItems.Objects[0]);
    Dateneditieren.giveSendungDataToGrid(Sendung);
    if IsPositiveResult(Dateneditieren.ShowModal()) then
    begin
      Sendung:= TSendung (Dateneditieren.StrGrAuswahl.Objects[1,2]);
      neuSendung:=TSendung(lvAuswahl.ItemFocused.SubItems.Objects[0]);
      Sendung:= neuSendung.Create(neuSendung.ID,neuSendung.Status,neuSendung.Rechnung);
      lvAuswahl.ItemFocused.SubItems.Add(Dateneditieren.StrGrAuswahl.Cells[1,1]);
      lvAuswahl.ItemFocused.SubItems.Add(Dateneditieren.StrGrAuswahl.Cells[2,1]);
      neuSendung:=TSendung.Create(Sendung.ID,(Dateneditieren.StrGrAuswahl.Cells[1,1]),Sendung.Rechnung);
      neuSendung:=TSendung(Dateneditieren.StrGrAuswahl.Cells[2,1]);
    end else
    begin
    IsNegativeResult(Dateneditieren.ShowModal())
    end;
SO bei der Kundenerstellung:

Code:
function TDataconnect.getKunden():TKundeList;
begin
  Result:= TKundeList.create();
  KundeQuery:= TIBOQuery.Create(nil);
  KundeQuery.SQL.Text:= 'SELECT * FROM KUNDEN ';
  KundeQuery.IB_Connection:= FDataBase;
  KundeTransa:= TIBOTRansaction.Create(nil);
  KundeTransa.IB_Connection:= FDataBase;
  KundeQuery.IB_Transaction:= KundeTransa;
  KundeTransa.StartTransaction();
  try
    KundeQuery.Open();
    while not KundeQuery.Eof do
    begin
      kunde:= TKunde.Create(KundeQuery.Fieldbyname('Kunden_ID').asInteger,
                            KundeQuery.FieldbyName('Vorname').asString,
                            KundeQuery.FieldbyName('nachname').AsString);
      Result.addkunde(Kunde);
      KundeQuery.Next();
    end;
    KundeTransa.Commit();
  except
    on e:Exception do
    begin
      ShowMessage(e.Message);
      KundeTransa.Rollback();
    end;
  end;
end;
und so beim übergeben:

Code:
procedure TDatenEditieren.giveKundeDataToGrid(AKUnde:TKunde);
Begin
  StrGrAuswahl.Cells[0,1]:= IntToStr(Akunde.Id);
  StrGrAuswahl.Cells[1,1]:= AKUnde.Vorname;
  StrGrAuswahl.Cells[2,1]:=AKunde.Nachname;
end;



ich weüß nicht habe ich noch relevante stellen nicht aufgelistet? wenn ja füge ich welche hinzu

DeddyH 6. Dez 2011 07:58

AW: StringGrid-Problem
 
Zitat:

Delphi-Quellcode:
if IsPositiveResult(Dateneditieren.ShowModal()) then
    begin
      Kunde:= TKunde (Dateneditieren.StrGrAuswahl.Objects[1,2]);
      neuKunde:=TKunde(lvAuswahl.ItemFocused.SubItems.Objects[0]);
      kunde:= neuKunde.Create(neuKunde.ID,neuKunde.Vorname,neuKunde.Nachname);
      lvAuswahl.ItemFocused.SubItems.Add(Dateneditieren.StrGrAuswahl.Cells[1,1]);
      lvAuswahl.ItemFocused.SubItems.Add(Dateneditieren.StrGrAuswahl.Cells[2,1]);
      neuKunde:=TKunde.Create(Kunde.ID,(Dateneditieren.StrGrAuswahl.Cells[1,1]),kunde.nachname);
      neuKunde:=Tkunde(Dateneditieren.StrGrAuswahl.Cells[2,1]);
      connect.KundeTransa.StartTransaction;
      connect.KundeTransa.Commit;
      connect.KundeQuery.CommitUpdates;
    end else

Wozu die Zuweisungen an Kunde und neukunde, wenn Du diese anschließend mit neu angelegten Instanzen überschreibst (im Falle von neukunde dann anschließend sogar noch einmal mit einer bestehenden)? Ich habe das Gefühl, dass Du Dir eine ganze Menge Speicherlecks da einprogrammiert hast.

p80286 6. Dez 2011 07:58

AW: StringGrid-Problem
 
worauf bezieht sich "UNTER" ?

Gruß
K-H

Edit:
gefühlt ist es mit der Trennung von Daten und Darstellung auch nicht weit her.

himitsu 6. Dez 2011 08:03

AW: StringGrid-Problem
 
DBDaten > ListView > StringGrid > ListView

Warum nicht so?
DBDaten > DBGrid <> eingebauter Editor


PS: Der Titel ist nicht grade aussagekräftig, bzw. rate mal wieviele Probleme mit irgendeiner Komponente haben und wie unübersichtlich es wäre, wenn alle nur XYZKomponente-Problem schreiben?

Und was hat das Problem mit dem StringGrid zu tun?
Ich hab es jetzt so verstanden, daß du Probleme in der ListView hast. :gruebel:



Ach ja, in Bea1click sieht es so aus, als wenn du bearbeitete Daten immer nur einfügst (Create/Add/...) und nirgendwo etwas "überschreibst".

Impulz 6. Dez 2011 08:10

AW: StringGrid-Problem
 
Hi,
erstmal vielen Dank,
habe ja schon probleme mit dem StringGrid, da es anscheinend die Daten nicht richtig weitergibt.

mein aufbau ist ja gerade DB-LV-SG-LV
ist doch schon so aufgebaut. der andere Gedanke meinerseits wäre sonst DB-LV-SG-DB würde sich soetwas lohnen?
Mit dem Titel hast du recht...:oops: sorry

DeddyH 6. Dez 2011 08:12

AW: StringGrid-Problem
 
Versuchen wir es doch einmal so: das Form2 bekommt eine Property vom Typ TKunde spendiert. Nun könnte man das in Form1 sinngemäß so machen:
Code:
var Kunde: TKunde;
if Bearbeiten then
  Kunde := aktueller_Kunde_in_ListView
else if Neuanlage then
  Kunde := TKunde.Create;
Form2.Kunde := Kunde;

Impulz 6. Dez 2011 09:08

AW: StringGrid-Problem
 
Vielen Dank Detlef,

Habe gerade eine Lösung gefunden... Ich werde einfach eine Prozedur anlegen die den Kunden so Speichert (in der Datenbank) und dann das ListView einfach aktualisiert :).

aber vielen Dank für euere Hilfe :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 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