Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi In Stringgrid per Schleife schreiben (https://www.delphipraxis.net/148749-stringgrid-per-schleife-schreiben.html)

Repatilo 7. Mär 2010 18:24


In Stringgrid per Schleife schreiben
 
Hallo Leute,

ich habe ein kleines aber hoffe mal recht einfach zu lösendes Problem.

Und zwar - meine Freundin soll für den Info Unterricht ein kleines Programm schreiben.
Hier soll ein Edit Feld genutzt werden welches Daten in ein Stringgrid überträgt - soweit so gut, das funktioniert auch.

Nun zu meinem Problem: Es soll eine Schleife gebaut werden welche die einzelnen Zeilen abfragt ob beschriftet oder unbeschriftet und wenn die Zeile leer ist den Text aus dem Edit Feld übertragen.
Also soll der Text aus dem Edit Feld nur in ein leeres Feld geschrieben werden ...

sprich: Zeile 1 ist bereits was drinn, also schreibe in Zeile 2 ... wenn diese auch voll ist ... schreibe in Zeile 3 usw.

Nun meine Frage: Wie lässt sich das realisieren ?

Ich hoffe Ihr könnt hier weiter helfen.

Gruß Repatilo

DeddyH 7. Mär 2010 18:37

Re: In Stringgrid per Schleife schreiben
 
Hallo und Willkommen in der DP :dp:,

soll es wirklich nur eine Schleife sein? Mit 2 verschachtelten Schleifen (Zeilen und Spalten) ist das nämlich weniger umständlich zu lösen. Die Anzahl der Zeilen steht in StringGrid.RowCount, die Anzahl der Spalten in StringGrid.ColCount. Beide sind 0-indiziert, was bedeutet, dass die letzte Zeile den Index RowCount - 1 und die letzte Spalte den Index ColCount - 1 hat. Der Inhalt einer Zelle steht in StringGrid.Cells[Spalte, Zeile]. Damit hast Du alle Informationen, die Du benötigst. Wenn Du nicht weiterkommst, frag einfach noch einmal nach.

p80286 8. Mär 2010 11:16

Re: In Stringgrid per Schleife schreiben
 
Zitat:

Zitat von Repatilo
Nun zu meinem Problem: Es soll eine Schleife gebaut werden welche die einzelnen Zeilen abfragt ob beschriftet oder unbeschriftet und wenn die Zeile leer ist den Text aus dem Edit Feld übertragen.
Also soll der Text aus dem Edit Feld nur in ein leeres Feld geschrieben werden ...

sprich: Zeile 1 ist bereits was drinn, also schreibe in Zeile 2 ... wenn diese auch voll ist ... schreibe in Zeile 3 usw.

wenn ich Dich richtig verstehe, dann willst Du bzw. Deine Freundin, nur in eine Spalte des Stringgrids etwas schreiben?

Wenn Du so vorgehst ist es etwas einfacher:

Delphi-Quellcode:
for i:=0 to Stringgrid.RowCount-1 do //ggf. i:=1 falls eine fixe Row
  if Stringgrid.Cells[i,x]='' then          // ist die Zelle leer?
    stringgrid.Cells[i,x]:=Edit.Text;       // dann schreibe
Gruß
K-H

Repatilo 9. Mär 2010 17:53

Re: In Stringgrid per Schleife schreiben
 
ok vielen dank fürs 1. ...

Leider komme ich nicht wirklich weiter --- immerhinn habe ich Ihn mit dem letzten Beitrag soweit, die vorhandene Spalte nicht einfach zu überschreiben ... nur ... er zählt nicht weiter und schreibt dann in die nächste :( :wiejetzt:

Nur zur Erklärung - vorerst möchte ich, das das Programm erstmal nur den Text aus dem Edit2.Text (also buch.Titel) in den Stringgrid schreibt und dann eine Spalte weiter wandert und schaut ob diese leer ist. Rein zum Verständnis halt - wenn das erstmal klappt kann ich mir den rest hoffentlich selbst zusammen reimen ;)

Hier der Quältext :P
:coder:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, Menus;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    StringGrid1: TStringGrid;
    Button1: TButton;
    Edit2: TEdit;
    Label2: TLabel;
    Edit3: TEdit;
    Label3: TLabel;
    Edit4: TEdit;
    Label4: TLabel;
    Edit5: TEdit;
    Label5: TLabel;
    Edit6: TEdit;
    Label6: TLabel;
    Edit7: TEdit;
    Label7: TLabel;
    Edit8: TEdit;
    Label8: TLabel;
    Edit9: TEdit;
    Label9: TLabel;
    Edit10: TEdit;
    Label10: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TBuch = class
    public
    Buchnummer,Erscheinungsjahr:integer;
    Titel,Autor,Verlag,Auflage:string;
    function buchangaben:string;
    end;

  TUnterhaltungsliteratur = class (TBuch)
    public
    Inhaltsangabe:string;
    function Unterhaltungsliteraturangaben:string;
    end;

  TFachbuecher = class (TBuch)
    public
    Schlagworte:string;
    function Fachbuchangaben:string;
    end;

  TSchulbuecher = class (TBuch)
    public
    Klassenstufe:string;
    function Schulbuchangaben:string;
    end;

  TAusleihe = class (TBuch)
    public
    Name,Vorname,Klasse:string;
    function Ausleihangaben:string;
    end;

var
  Form1: TForm1;
  Buch:TBuch;
  Unterhaltungsliteratur:TUnterhaltungsliteratur;
  Fachbuecher:TFachbuecher;
  Schulbuecher:TSchulbuecher;
  Ausleihe:TAusleihe;
  Stringgrid1:TStringGrid;
  i:Integer;
  x:Integer;

  Buchangaben,Unterhaltungsangaben,Fachbuchangaben,Schulbuchangaben,
  Ausleihangaben:string;

implementation

{$R *.dfm}

function TBuch.buchangaben:string;
  begin

  end;

function TUnterhaltungsliteratur.Unterhaltungsliteraturangaben:string;
  begin

  end;

function TFachbuecher.Fachbuchangaben:string;
  begin

  end;

function TSchulbuecher.Schulbuchangaben:string;
  begin

  end;

function TAusleihe.Ausleihangaben:string;
  begin

  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    buch:=TBuch.Create;
    Unterhaltungsliteratur:=TUnterhaltungsliteratur.Create;
    Fachbuecher:=TFachbuecher.Create;
    Schulbuecher:=TSchulbuecher.Create;
    Ausleihe:=TAusleihe.Create;
    buch.Buchnummer:=strtoint(edit1.text);
    buch.Erscheinungsjahr:=strtoint(edit6.Text);
    buch.Titel:=(edit2.Text);
    buch.Autor:=(edit3.text);
    buch.Verlag:=(edit4.Text);
    buch.Auflage:=(edit5.Text);
    Unterhaltungsliteratur.Inhaltsangabe:=(edit7.Text);
    Fachbuecher.Schlagworte:=(edit8.Text);
    Schulbuecher.Klassenstufe:=(edit9.Text);

     for x:=1 to Stringgrid1.RowCount-1 do
  if Stringgrid1.Cells[i,x]='' then
    stringgrid1.Cells[i,x]:=buch.Titel;


end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  halt;
end;

end.

DeddyH 9. Mär 2010 18:18

Re: In Stringgrid per Schleife schreiben
 
Du hast es für die Laufvariable x gemacht, nun musst Du es noch für i machen. Beide sollten übrigens lokale Variablen sein, Delphi gibt Dir bestimmt eine diesbezügliche Meldung aus.

Repatilo 9. Mär 2010 18:35

Re: In Stringgrid per Schleife schreiben
 
jupp das "x" war nen kleiner test ... und jaaa ... delphi sagt mir es möchte doch bitte eine lokale Variable sein ... nur weiß ich damit nichts anzufangen und auch mit dem "i" klappt es nicht :(

DeddyH 9. Mär 2010 18:54

Re: In Stringgrid per Schleife schreiben
 
Delphi-Quellcode:
procedure TDeinForm.Wasweißich;
var Zeile, Spalte: integer; //lokale Variablen der Methode
begin
  for Zeile := StringGrid.FixedRows to StringGrid.RowCount - 1 do //keine fixen Zeilen
    for Spalte := StringGrid.FixedCols to StringGrid.ColCount - 1 do //keine fixen Spalten
      if StringGrid.Cells[Spalte, Zeile] = '' then
        StringGrid.Cells[Spalte, Zeile] := 'Wuppdi';
end;
Getippt und nicht getestet.

Salazriel 9. Mär 2010 19:06

Re: In Stringgrid per Schleife schreiben
 
So wie ich das sehe ist der Ansatz von p80286 falsch.

Zitat:

Zitat von p80286
Delphi-Quellcode:
for i:=0 to Stringgrid.RowCount-1 do //ggf. i:=1 falls eine fixe Row
  if Stringgrid.Cells[i,x]='' then          // ist die Zelle leer?
    stringgrid.Cells[i,x]:=Edit.Text;       // dann schreibe

Die Zeile der Zelle steht aber an zweiter Stelle, hier wird die Spalte verändert

Delphi-Quellcode:
for i:=0 to Stringgrid.RowCount-1 do //ggf. i:=1 falls eine fixe Row
  if Stringgrid.Cells[0,i]='' then          // ist die Zelle leer?
    stringgrid.Cells[0,i]:=Edit.Text;       // dann schreibe
    //Spalte=0 damit der Buchtitel in der ersten Spalte steht
Ich denke so müsste es klappen

Repatilo 9. Mär 2010 19:12

Re: In Stringgrid per Schleife schreiben
 
soooo ... und wieder einen Schritt weiter :D :bouncing4: Danke !!!!
Nun aber das nächste ... die Schleife geht ja nun automatisch jede Zeile durch und schreibt diese voll ... sie soll aber nur eine zeile voll schreiben und dann aufhören ...

kann ich ihr irgendwie sagen, gehe nur eine zeile weiter und sobald du geschrieben hast höre auf ?

DeddyH 9. Mär 2010 19:14

Re: In Stringgrid per Schleife schreiben
 
Dann nimm doch einfach die Zeilen-Schleife raus und weise der Variablen "Zeile" den Index der gewünschten Zeile zu.

[edit] Also so:
Delphi-Quellcode:
procedure TDeinForm.Wasweißich;
var Zeile, Spalte: integer; //lokale Variablen der Methode
begin
  {for Zeile := StringGrid.FixedRows to StringGrid.RowCount - 1 do //keine fixen Zeilen}
  Zeile := StringGrid.FixedRows; //das wäre die erste nicht fixierte Zeile
  for Spalte := StringGrid.FixedCols to StringGrid.ColCount - 1 do //keine fixen Spalten
    if StringGrid.Cells[Spalte, Zeile] = '' then
      StringGrid.Cells[Spalte, Zeile] := 'Wuppdi';
end;
[/edit]


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