Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi prüfen ob alle stringgrid zellen einen wert haben (https://www.delphipraxis.net/61773-pruefen-ob-alle-stringgrid-zellen-einen-wert-haben.html)

droppi 26. Jan 2006 09:18


prüfen ob alle stringgrid zellen einen wert haben
 
hallo

ich stehe vor einem problem. ich will nachprüfen ob alle zellen in einer stringgrid belegt sind, also <>''. ich habe schon die forensuche befragt, aber die konnte mir auch nicht weiterhelfen.
ich hoffe ihr könnt es. danke schonmal im voraus!

Hansa 26. Jan 2006 09:55

Re: prüfen ob alle stringgrid zellen einen wert haben
 
Ein Stringgrid hat RowCount, ColCount, Row und Col. Natürlich auch Cells. Und was eine for-Schleife ist, das muß man auch wissen. Rest ist Kleinigkeit.

Hobby-Programmierer 26. Jan 2006 10:24

Re: prüfen ob alle stringgrid zellen einen wert haben
 
Mahlzeit :-D ...,

ich behaupte mal das Du das auch kannst, wenn Du ein wenig logisch überlegst und die OH zur Hilfe nimmst!

mal aus dem Stehgreif ungetestet
Delphi-Quellcode:
var IRow, ICol: Integer;
begin
  with StringGrid do begin
    for IRow:= 0 to RowCount do
      for ICol:= 0 to ColCount do
        if Cells[ICol, IRow] = '' then begin
          // hier muss Dein eigener Code rein
        end;
  end;
end;
Gruss Mario

[add]
:shock: Tzz, Delphi 7 Enterprise und solche Fragen

Lannes 26. Jan 2006 14:09

Re: prüfen ob alle stringgrid zellen einen wert haben
 
Hallo,

hier mal meine Variante:
Delphi-Quellcode:
for z := 0 to StringGrid1.RowCount-1 do
  if StringGrid1.Rows[z].IndexOf('') <> -1 then
    showmessage('In Zeile '++' leere Zelle gefunden');
StringGrid1.Rows[z].IndexOf('') gibt den Index der ersten leeren Zelle zurück,
wenn alle Zellen der Zeile einen String enthalten wird -1 zurückgegeben.

droppi 26. Jan 2006 14:49

Re: prüfen ob alle stringgrid zellen einen wert haben
 
richtig. auf das mit der schleife bin ich auch schon gekommen. aber ich will ja nicht nachprüfen ob eine zelle einen leerstring besitzt, sondern ob wirklich alle zellen in der stringgrid voll sind.
trotzdem danke! ich habe mittlerweile eine andere möglichkeit gefunden. ich zähle einfach mit wie oft werte in die stringgrid geschrieben werden. wenn es dann die zellenanzahl ergibt kann ich dann meine procedure ausführen.

Lannes 26. Jan 2006 15:30

Re: prüfen ob alle stringgrid zellen einen wert haben
 
Hallo,
Zitat:

Zitat von droppi
...aber ich will ja nicht nachprüfen ob eine zelle einen leerstring besitzt, sondern ob wirklich alle zellen in der stringgrid voll sind.

:gruebel: wenn eine Zelle einen Leerstring besitzt, dann ist sie Leer, folglich sind nicht alle Zellen voll.

marabu 26. Jan 2006 16:00

Re: prüfen ob alle stringgrid zellen einen wert haben
 
Hi.

So funktioniert es auch, wenn Spalten- und Reihentitel verwendet werden - gesucht wird von links nach rechts, dann von oben nach unten:

Delphi-Quellcode:
function FindEmptyCell(sg: TStringGrid; var gc: TGridCoord): boolean;
var
  iRow, iCol: Integer;
begin
  gc.X := -1;
  gc.Y := -1;
  Result := false;
  with sg do
    for iRow := FixedRows to Pred(RowCount) do
      for iCol := FixedCols to Pred(ColCount) do
        if Cells[iCol, iRow] = '' then
        begin
          gc.X := iCol;
          gc.Y := iRow;
          Result := true;
          Exit;
        end;
end;
Grüße vom marabu

Lannes 26. Jan 2006 23:03

Re: prüfen ob alle stringgrid zellen einen wert haben
 
Hallo,

na dann, meine Variante mit Berücksichtigung eventueller Spalten- und Zeilentitel :wink:
Delphi-Quellcode:
for z := StringGrid1.FixedRows to StringGrid1.RowCount-1 do
  if StringGrid1.Rows[z].IndexOf('') >= FixedCols then
    showmessage('In Zeile '++' leere Zelle gefunden');

marabu 27. Jan 2006 06:11

Re: prüfen ob alle stringgrid zellen einen wert haben
 
Hallo Lannes,

bei gruppierten Daten ist FixedCols > 1 und die erste Spalte oft leer. Die Methode IndexOf() kann damit leider nicht umgehen. Normalerweise bevorzuge ich wegen der LOC Metrik deine Variante, aber für meine CodeLib muss die Funktion eine ausreichend hohe Wiederverwendbarkeit besitzen.

Freundliche Grüße vom marabu

Lannes 27. Jan 2006 09:50

Re: prüfen ob alle stringgrid zellen einen wert haben
 
Hallo marabu,

richtig, dann kann ich mit Cols[z].IndexOf('') den Datenbereich überprüfen:
Delphi-Quellcode:
for z := StringGrid1.FixedCols to StringGrid1.ColCount-1 do
  if StringGrid1.Cols[z].IndexOf('') >= StringGrid1.FixedRows then
    showmessage('In Spalte '+IntToStr(z)+' leere Zelle gefunden');
Sollten sich auch innerhalb der FixedRow-Zeilen leere Zellen befinden,
muss/kann man deinen Ansatz verwenden,
oder die leeren Zellen innerhalb der Fixspalten und -zeilen mit einem Leerzeichen belegen.

Um die Wiederverwendbarkeit noch zu erhöhen,
z.B. wenn nur ein Teil-Bereich der eigentlichen Daten geprüft werden soll,
schlage ich folgende Funktion(in Anlehnung an Deine) vor:
Delphi-Quellcode:
function FindEmptyCell_X(sg: TStringGrid; var gr: TGridRect): boolean;
var c,r : integer;
begin
  Result := False;
  with sg do
    for c := gr.Left to gr.Right do
      for r := gr.Top to gr.Bottom do
        if Cells[c,r] = '' then
        begin
          gr := TGridrect(Rect(c,r,c,r));
          Result := True;
          Exit;
        end;
end;
Aufrufbeispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var gr : TGridRect;
begin
  with StringGrid1 do
    begin
    //aufruf mit Bereichsangabe
    gr := TGridRect(Rect(3,2,ColCount-2,RowCount-2));
    //oder auch
    //gr := Selection;
    if FindEmptyCell_X(StringGrid1,gr) then
      begin
      Selection := gr;
      showmessage('Es fehlen Daten in der markierten Zelle');
      end
      else
        showmessage('Daten sind vollständig');
    end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 Uhr.
Seite 1 von 2  1 2      

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