Announcement

Collapse
No announcement yet.

Zeile in TStrinGrid löschen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeile in TStrinGrid löschen

    Hallo!

    Ich habe eine Frage zu TStringGrid.<br>
    Ich möchte gerne eine ausgewählte Zeile aus einem TStrinGrid löschen.<br>
    Ich bin nun schon so weit, dass ich den Inhalt der ausgewählten Zeile löschen kann. Es wird aber halt nur der Inhalt gelöscht.<br>
    Die ausgewählte Zeile bekomme ich über das <b>OnSelectCell</b> Ereigniss.<br>
    Könnte mir eventuell jemand erklären, wie ich nun die ausgewählte Zeile löschen kann?<br>

    Besten Dank im voraus

    Torsten Bloth

  • #2
    Hallo,

    wenn mit dem Begriff "Löschen" das automatische Nachrücken der folgenden Zeilen gemeint ist, wird man das ebenfalls in die eigene Hand nehmen müssen. Allerdings stellt sich dann schon die Frage, ob dieser Aufwand gerechtfertigt ist. Denn sinnvoller wird der Einsatz von TDBGrid sein, da hier nur direkt die Datenmenge editiert werden muss, alles andere (visuelle Anzeige) macht die VCL. Falls keine Datenbank vorkommt, würde ich zu einer In-Memory-Tabelle greifen (TClientDataSet-Instanz oder virtuelles Speichertabelle, die über das SHAPE-Objekt von ADO erzeugt wird). In beiden Fällen kann man dann über TDataSource eine Verbindung zum TDBGrid herstellen und über den TDBNavigator "Datensätze" in die Speichertabelle neu einfügen bzw. löschen

    Comment


    • #3
      Hallo Herr Kosch!

      Vielen Dank für die prompte Antwort.<br>
      Leider kann ich mit den von Ihnen gezeigten Möglichkeiten nicht viel anfangen, da ich mich damit noch nicht stark beschäftigt habe.<br>

      Dennoch muss ich ein paar Zeilen los werden.<br>
      Eine Datenbank wollte ich möglichst nicht einsetzen, da das Datenvolumen absolut gering ist und auch in naher Zukunft bleibt.<br>
      Weiterhin würde ich gerne bei <b>TStringGrid</b> bleiben, da ein Löschen einer Zeile nicht oft vorkommen wird. Mein Programm liest nur ein paar Daten via <b>ReadLn</b> aus einer Textdatei in <b>TStringGrid</b> ein.<br>
      Diese Variante wird sicherlich bei einer grossen Menge an Daten weniger performant, doch ich sehe momentan keine andere mir mögliche Alternative. Und es funktioniert ja auch. Bis eben auf oben erwähnte Problematik.<br>
      Somit würde mich hier doch mehr eine Möglichkeit für <b>TStringGrid</b> interessieren.<br>
      Es sei denn, Sie können mir den Zugriff via <b>TClientDataSet</b> etc. auf eine Textdatei erklären oder mich auf ein paar Beispiele verweisen. ;-)<br>

      mfg

      Torsten Blot

      Comment


      • #4
        Hallo,

        im Gegensatz zu TDBGrid (bei dem die anzuzeigenden Daten aus einem TDataSet-Nachfolger stammen) ist TStringGrid nicht nur für die Anzeige der Daten zuständig, sondern auch für die Speicherung der Information. Wenn eine Zeile aus dem StringGrid "gelöscht" werden soll, muss man den Inhalt aller nachfolgenden Zeilen "von Hand" in die darüberliegende Zeile kopieren. Somit wird die zu entfernende Zeile durch Überschreiben "gelöscht", wobei die alte letzte Zeile am Ende geleert wird. Der Aufwand dafür ist höher als der Aufwand für eine "Mini-Datenbank" über eine Textdatei.

        Wenn <b>TClientDataSet</b> oder <b>ADO Express</b> zur Verfügung steht, kann man In-Memory-Tabellen verwenden, die Daten persistent über eine beliebige Datei speichern. Das folgende Beispiel für TClientDataSet stammt aus meinem Buch <i>Client/Server Datenbankentwicklung mit Delphi</i>. Alle wichtigen Sachen werden über den Objektinspektor erledigt:
        <pre>
        { ************************************************** **************
        Source File Name : LocalCDSFrm.pas
        Typ : Hauptformular
        Autor : Andreas Kosch
        Compiler : Delphi 4.02 CSS UpdatePack #3
        Betriebssystem : Windows 98
        Beschreibung : TClientDataSet als BDE-Ersatz für einfache lokale
        Datenbanktabellen.
        Vorgehensweise:
        1. TClientDataSet-Komponente im Formular plazieren
        2. Mit Doppelklick den Feldeditor öffnen und neue
        Datenfelder anlegen
        3. Rechter Menüklick auf TClientDataSet-Instanz:
        Dataset erstellen..
        Das CDS wird daraufhin automatisch aktiv, die
        Struktur wird im DBGrid angezeigt.
        ************************************************** ************** }

        unit LocalCDSFrm;

        interface

        uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
        Grids, DBGrids, ExtCtrls, DBCtrls, Db, DBClient, ComCtrls, StdCtrls,
        ActnList, Menus;

        type
        TFormMain = class(TForm)
        StatBar: TStatusBar;
        ClientDataSet1: TClientDataSet;
        DataSource1: TDataSource;
        DBNavigator1: TDBNavigator;
        DBGrid1: TDBGrid;
        ClientDataSet1Name: TStringField;
        ClientDataSet1Telefon: TStringField;
        ClientDataSet1Datum: TDateField;
        ButtonMerge: TButton;
        ...

        procedure TFormMain.ActionMergeChangeExecute(Sender: TObject);
        begin
        ClientDataSet1.MergeChangeLog;
        ClientDataSet1.First;
        end;
        </pre&gt

        Comment


        • #5
          Hallo Herr Kosch!

          Vielen Dank an dieser Stelle.<br>
          Das mit dem Löschen einer Zeile aus TStringGrid ist tatsächlich sehr aufwendig.<br>
          Es läuft genau, wie von ihnen beschrieben.<br>
          Habe ich beispielsweise ein TStringGrid mit 200 Zeilen und will die 2. Zeile löschen, so muss ich 198 Kopiervorgänge für die Zeilen 3 bis 200 einleiten. Denn man kann anscheinend nur die Anzahl der Zeilen über <b>ColCount</b> beeinflussen. Ändert man diesen Wert, so werden die Zeilen aber am Ende abgeschnitten.<br>
          Nun denn, somit werde ich mich mit ihrer Variante eindringlicher beschäftigen müssen.<br>
          Vielen Dank für das beigelegte Beispiel. Leider nutze ich z.Z. nur ihr Buch "Delphi - Win32 Lösungen" und kann somit nicht ohne weiteres nachschlagen.

          mfg

          Torsten Blot

          Comment


          • #6
            Hallo Torsten,<br>schau mal da nach<br>
            http://www.scalabium.com/faq/dct0057.htm <br>
            :-) Jens Schuman

            Comment


            • #7
              Hallo Jens!

              Vielen Dank für diesen Tip. Das ist genau das Richtige.<br>
              Nun kann ich wieder ruhig schlafen. ;-)<br>
              Nochmals besten Dank.

              mfg

              Torsten Blot

              Comment

              Working...
              X