AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

StringGrid - Aktuelle Zeile löschen

Ein Thema von Sturmrider · begonnen am 9. Mai 2006 · letzter Beitrag vom 26. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2   
Sturmrider

Registriert seit: 13. Mär 2006
30 Beiträge
 
#1

StringGrid - Aktuelle Zeile löschen

  Alt 9. Mai 2006, 22:04
Hallo Leute
Ich habe mir hier folgenden Source zusammengewurschtelt:
Delphi-Quellcode:
type
procedure BitBtnEintragLoeschenClick(Sender: TObject; const ARow : Integer);

//[...]

procedure TFSpielplan01.BitBtnEintragLoeschenClick(Sender: TObject; const ARow : Integer);
var
  i : integer;
begin
  for i := ARow to FSpielfeld.StringGrid1.RowCount - 2 do
  Begin
    FSpielfeld.StringGrid1.Rows[i].Clear;
    FSpielfeld.StringGrid1.Rows[i].AddStrings(StringGrid1.Rows[i+1]);
  end;
  FSpielfeld.StringGrid1.RowCount := FSpielfeld.StringGrid1.RowCount - 1;
end;
leider habe ich noch nicht so ganz verstanden, wie const ARow: Integer funktioniert bzw. wofür ARow genau steht...
Laut der Seite wo ich die Begriffe vorgeworfen bekommen habe müsste ich so die aktuell ausgewählte Zeile des StringGrids löschen können, wobei die Zeile darunter automatisch nachrückt...
Nur leider funktioniert das ganze auch gar nicht...
ich habe leider wirklich keine Ahnung, wie ich mein Ziel möglichst leicht erreichen kann
Wäre echt toll, wenn ihr mir helfen könntet! (vielleicht auch eine ganz andere Methode, die ich verstehe )
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: StringGrid - Aktuelle Zeile löschen

  Alt 9. Mai 2006, 22:38
Hallo.

Hier ein Klassiker:

Delphi-Quellcode:
type
  TGridCracker = class(TCustomGrid);

procedure DeleteRow(sg: TStringGrid; index: Integer);
var
  iRow: Integer;
begin
  with TGridCracker(sg) do
  begin
    iRow := Row;
    DeleteRow(index);
    if iRow < RowCount
      then Row := iRow
      else Row := Pred(RowCount);
  end;
end;
Verwenden kannst du ihn so:

Delphi-Quellcode:
with FSpielfeld do
  DeleteRow(StringGrid1, StringGrid1.Row);
Grüße vom marabu
  Mit Zitat antworten Zitat
Sturmrider

Registriert seit: 13. Mär 2006
30 Beiträge
 
#3

Re: StringGrid - Aktuelle Zeile löschen

  Alt 9. Mai 2006, 23:09
Das mit dem
Delphi-Quellcode:
type
  TGridCracker = class(TCustomGrid);
funktioniert irgendwie nicht ich habe auch schon bereits
Delphi-Quellcode:
type
  TFSpielplan01 = class(TForm)
oben stehen. Wie mache ich, dass diese class auch funktioniert ? der zeit kommt nämlich ein Allert: ":" erwartet aber "=" gefunden. Und wenn ich einfach folgendes schreibe:
Delphi-Quellcode:
type
  TGridCracker : class(TCustomGrid);
kommt auch wieder ein Allert: "ein Bezeichner erwartet, aber "class" gefunden"

ansonsten, schoneinmal an dieser Stelle vielen Dank für deine Hilfe!
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: StringGrid - Aktuelle Zeile löschen

  Alt 10. Mai 2006, 00:21
Hallo,

marabus Code sollte funktionieren. Zeige uns bitte, wie du ihn in deinen Quelltext eingebaut hast, vielleicht finden wir dann den Grund für die Fehlermeldungen.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Sturmrider

Registriert seit: 13. Mär 2006
30 Beiträge
 
#5

Re: StringGrid - Aktuelle Zeile löschen

  Alt 10. Mai 2006, 01:25
Okey, hier der Code (ich weiß, dass das mit dem doppelten type nicht so gedacht war, aber anders funktioniert es überhaupt nicht...d.h. kann ich noch nichteinmal das Prog. starten):
Delphi-Quellcode:
unit mspielplan;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids, Buttons, ExtCtrls, Printers, Menus; {Printers}

type
  TFSpielplan01 = class(TForm)
{[...]}
    StringGrid1: TStringGrid;
{[...]}
    BitBtnEintragLoeschen: TBitBtn;
    BitBtnSpeichern: TBitBtn;
    BitBtnLaden: TBitBtn;
    BitBtnDrucken: TBitBtn;
{[...]}
    procedure BitBtnEintragLoeschenClick(Sender: TObject);
    procedure BitBtnNeuerEintragClick(Sender: TObject);
    procedure BitBtnSpeichernClick(Sender: TObject);
    procedure BitBtnLadenClick(Sender: TObject);
    procedure BitBtnDruckenClick(Sender: TObject);
{[...]}
   private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FSpielplan01: TFSpielplan01; spalte, zeile, a, b, c: Integer;

implementation

uses mformular, mspielfeld;

{$R *.DFM}

type
  TGridCracker = class(TCustomGrid);

procedure DeleteRow(sg: TStringGrid; index: Integer);
var
  iRow: Integer;
begin
  with TStringGrid(sg) do
  begin
    iRow := Row;
    DeleteRow(index);
    if iRow < RowCount
      then Row := iRow
      else Row := Pred(RowCount);
  end;
end;

procedure TFSpielplan01.BitBtnEintragLoeschenClick(Sender: TObject);
begin
   with FSpielfeld do
  DeleteRow(StringGrid1, StringGrid1.Row);
end;

{#########das hier hatte ich ganz am Anfang...aber das löscht immer nur den untersten Beitrag und ist wohl viel zu Kompliziert gemacht ^^° #############
procedure TFSpielplan01.BitBtnEintragLoeschenClick(Sender: TObject);
var i: Integer; test: String;
begin
  x:= StringGrid1.RowCount;
  if StringGrid1.Cells[3,x-1] = 'H' then begin
      x2:= FSpielfeld.StringGrid1.RowCount;
      if x2>0 then begin
      x2:=x2-1;
      for i:=0 to 4 do begin
        FSpielfeld.StringGrid1.Cells[i,x2] := '';
      end;
      FSpielfeld.StringGrid1.RowCount:=x2;
      FSpielfeld.StringGrid1.Height := x2*25+25;
      end;
  end;
  test:= StringGrid1.Cells[3,x-1];
  if x>0 then begin
      x:=x-1;
      for i:=0 to 10 do begin
        StringGrid1.Cells[i,x] := '';
      end;
      StringGrid1.RowCount:=x;
      StringGrid1.Height := x*25+25;
  end;
end;         }

{[...]}
end.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: StringGrid - Aktuelle Zeile löschen

  Alt 10. Mai 2006, 09:00
Guten Morgen.

Die Typvereinbarung für die Klasse TGridCracker steht ja schon an einer brauchbaren Stelle. Im auskommentierten Click-Handler machst du aber mehr als nur eine Zeile in einem Grid löschen. Du prüfst, ob in der vorletzten Spalte der letzten Zeile im SpielplanGrid ein 'H' (Heimspiel?) eingetragen ist. Wenn ja, dann entfernst du die letzte Zeile aus dem SpielfeldGrid, bevor du dann die letzte Zeile aus dem SpielplanGrid auch entfernst. Beide Grids dimensionierst du neu, indem du die Gridabmessungen grob an den Zellbereich anpasst. Ich versuche mal behutsam ein paar Änderungen an deinem Click-Handler:

Delphi-Quellcode:
procedure TFSpielplan01.BitBtnEintragLoeschenClick(Sender: TObject);
var
  i, iSF, iSP: Integer;
  test: String;
begin
  iSP := Pred(StringGrid1.RowCount);
  if StringGrid1.Cells[3, iSP] = 'Hthen
  begin
    iSF := Pred(FSpielfeld.StringGrid1.RowCount);
    DeleteRow(FSpielfeld.StringGrid1, iSF);
    ResizeGrid(FSpielfeld.StringGrid1);
  end;
  DeleteRow(StringGrid1, iSP);
  ResizeGrid(StringGrid1);
end;
Die Bedingungen unter denen eine Aktion ausgeführt werden darf, solltest du außerhalb des Aktionscodes prüfen. Ob x > 0 ist, prüfst du in deinem Code eh zu spät, der Zugriff auf die Zelle mit dem 'H' ist da schon ungeprüft gescheitert.

Hier noch die Routine ResizeGrid:

Delphi-Quellcode:
procedure ResizeGrid(sg: TStringGrid);
var
  iCol, iRow: Integer;
begin
  with sg do
  begin
    Width := ColCount * GridLineWidth + Ord(BorderStyle) * 3;
    for iCol := 0 to Pred(ColCount) do
      Width := Width + ColWidths[iCol];
    Height := RowCount * GridLineWidth + Ord(BorderStyle) * 3;
    for iRow := 0 to Pred(RowCount) do
      Height := Height + RowHeights[iRow];
  end;
end;
Noch ein paar allgemeine Ratschläge: Versuche deinen Variablen sprechende Namen zu geben - nicht StringGrid1 sondern SpielplanGrid. Und informiere dich mal über Actions.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: StringGrid - Aktuelle Zeile löschen

  Alt 10. Mai 2006, 09:12
Die Typvereinbarung ist zwar vorhanden, sie wird aber nicht genutzt.

Delphi-Quellcode:
type
  TGridCracker = class(TCustomGrid);

procedure DeleteRow(sg: TStringGrid; index: Integer);
var
  iRow: Integer;
begin
  with TGridCracker(sg) do // <--- so sollte es aussehen!
  begin
    iRow := Row;
    DeleteRow(index);
    if iRow < RowCount
      then Row := iRow
      else Row := Pred(RowCount);
  end;
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Sturmrider

Registriert seit: 13. Mär 2006
30 Beiträge
 
#8

Re: StringGrid - Aktuelle Zeile löschen

  Alt 10. Mai 2006, 15:13
okey, das habe ich jetzt soweit verstanden (denke ich) supi, DANKE!
Nur das mit dem "Die Typvereinbarung für die Klasse TGridCracker steht ja schon an einer brauchbaren Stelle." verstehe ich leider noch nicht so ganz
Delphi-Quellcode:
type
  TGridCracker = class(TCustomGrid);
mit dem Teil scheint das ganze nicht zu funktionieren...und ohne natürlich erst recht nicht :$
außerdem habe ich noch die Frage, sind Folgende Prozeduren nicht Subprozeduren und müssten auch unter privat eingetragen werden?
Delphi-Quellcode:
procedure DeleteRow(sg: TStringGrid; index: Integer);
procedure ResizeGrid(sg: TStringGrid);
(aber wenn, wie? 1zu1 nach oben kopieren?)

Gruß Sturmrider

[edit=SirThornberry]Delphi-Tags gesetzt. Mfg, SirThornberry[/edit]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: StringGrid - Aktuelle Zeile löschen

  Alt 10. Mai 2006, 17:03
Für deine Zwecke ist es in Ordnung, wenn du den Typ für die Hilfsklasse TGridCracker einfach am Beginn des Implementation Abschnittes deiner Form-Unit vereinbarst, so wie du es in deinem Beitrag schon gemacht hast. Wenn du dabei Syntaxfehler gemeldet bekommst, dann stelle deine Form (PAS und DFM) einfach mal als Anhang zur Verfügung und irgendwer korrigiert deinen Syntaxfehler. Die Hilfsklasse wird benötigt um auf die Methode TCustomGrid.DeleteRow() zugreifen zu können - die hat nämlich eine eingeschränkte Sichtbarkeit (private) und ist anders nicht ansprechbar.

Die Prozeduren DeleteRow() und ResizeGrid() habe ich so geschrieben, dass sie unabhängig von irgendeiner Form sind. So kannst du sie überall verwenden und musst ihren Code lediglich per $INCLUDE einbinden - oder du erstellst dir eine Unit GridUtils mit diesen Prozeduren. Auf jeden Fall solltest du keine Form-Methoden aus diesen Prozeduren machen. Es würde ihre allgemeine Verwendbarkeit verhindern.

marabu
  Mit Zitat antworten Zitat
Sturmrider

Registriert seit: 13. Mär 2006
30 Beiträge
 
#10

Re: StringGrid - Aktuelle Zeile löschen

  Alt 10. Mai 2006, 19:44
k, danke
wäre super, wenn der jenige, der den Fehler findet und behebt ihn auskommentieren könnte! (so dass ich es auch nachvollziehen und daraus lernen kann )

Gruß und vielen DANK!
Sturmrider
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 15:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf