Delphi-PRAXiS

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;

marabu 27. Jan 2006 12:00

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

deine Änderung an meinem Code gefällt mir gut.

marabu

Hobby-Programmierer 27. Jan 2006 12:29

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

Zitat von Lannes
Delphi-Quellcode:
for z := 0 to StringGrid1.RowCount-1 do
  if StringGrid1.Rows[z].IndexOf('') <> -1 then
    showmessage('In Zeile '++' leere Zelle gefunden');

:thumb: Hab garnicht gewusst das man dies so 'direkt' ansprechen kann.

@marabu, @Lannes:
Kann ich das durchsuchen der festen Spalten und Reihen in der Regel vernachlässigen oder sollten die immer mit einschlossen werden?

Gruss Mario :dancer:

marabu 27. Jan 2006 12:45

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

in meine code library stelle ich nur die Sachen ein, die sich universell verwenden lassen. In der konkreten Anwendung muss ich mir dann keine Gedanken machen, solange der vorliegende Anwendungsfall durch den library code mit abgedeckt ist.

Wenn du grundsätzlich nie Fixed-Bereiche in deinen Grids hast, dann wirst du über die Klimmzüge von Lannes und mir lächeln. Sobald du aber mal mit und mal ohne Fixed-Bereiche, eventuell auch mit Gruppierungen, arbeitest, wirst du es zu schätzen wissen, wenn der Code alles ohne weiteres Zutun berücksichtigt.

Entscheide selbst.

Freundliche Grüße vom marabu

Hobby-Programmierer 27. Jan 2006 19:51

Re: prüfen ob alle stringgrid zellen einen wert haben
 
Nabend marabu :) ...;
ich habe auch sowas wie ne priv. Code Box (DB). Diese Routinen nehme ich in der Regel für meine Anwendungen. Wenn damit alle eventualitäten abgedeckt sind um so besser! Lieber einen Fehler von Grund auf ausschliessen als später bei Programmänderungen unnötig suchen zu müssen. Gleiches Thema wie rechnen mit Uhrzeiten, aber das ist ein anderes Thema :lol:
ebenso freundliche Grüsse Mario :dancer:

PS: habe auf jeden Fall beide Versionen von Euch geklaut :oops:


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