Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Wie kann ich ein StringGrid mit Daten füllen?


Mentor86 - Mi 18.06.03 10:25
Titel: Wie kann ich ein StringGrid mit Daten füllen?
Hi Leute,

wie kann ich ein StringGrid füllen? Es soll ein Vigeneré Quadrat werden.
:arrow: Bitte schreibt mir den Quelltext!

MfG
Mentor86

Moderiert von user profile iconTino: Titel geändert.


Mentor86 - Mi 18.06.03 16:47

Hi, ich habe jetzt die erste Zeile alleine geschafft, aber ich weiss nicht wie ich es hinkriegen soll, dass jetzt unter jeder Spalte das Alphabet hinkriegen soll. Ich habe folgenden Quelltext benutzt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var i,x,y,z:integer;
begin
x:=0;
y:=0;
z:=65;
for i:=1 to 26 do
begin
stringgrid.cells[x,y]:=chr(z);
x:=x+1;
z:=z+1;
end;
end;



Kann mir jemand helfen?
MfG Mentor

Moderiert von user profile icontommie-lie: Delphi-Tags hinzugefügt


Tweafis - Mi 18.06.03 17:05

Hört sich doch schon besser an ;) Ich finde es nur nicht gut wenn jemand sagt: Schreibt mir den Quellcode. Probier es doch so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function vigenere(x,y: integer; grbuchst: boolean): char;
var anfang, ende: char;

function betw(x,a,b: integer): integer;
begin
  if x<a then result:=b-(a-x)
  else if x>b then result := a+(x-b)
  else result := x;
end;

begin
  if grbuchst then begin
    anfang := 'A';
    ende := 'Z';
  end
  else begin
    anfang := 'a';
    ende := 'z';
  end;
  result := Chr(betw(Ord(anfang)+(x-1)+(y-1), Ord(anfang), Ord(ende)));
end;


Aufrufen kannst du das dann mit

Stringgrid1.Cells[x,y] := vigenere(x-1,y-1,true);

Falls du denkst: Eigentlich unsinnig, im aufruf -1 und in der Funktion +1, dann denk daran, das dein Stringgrid von 0 ausgeht und das vigenere quadrat an sich unter 1 die reihe versteht, die mit B anfängt (BCDEFGHI...XYZA)

Jedenfalls nach meinem Kryptographie Buch (Geheime Botschaften - Simon Singh)

Der Parameter grbuchst gibt an ob grossbuchstaben zurückggegeben werden sollen. die funktion betw ist eigentlich nur zur besseren übersicht.


Tweafis - Mi 18.06.03 17:35

mit dem +1 -1 musst du noch gucken, ich weiß nicht genau


Mentor86 - Mi 18.06.03 18:07

Danke, ich treff mich gleich mit ´nem Freund, wir werden dann mal schauen, ob wir das hinkriegen.
MfG Mentor


Mentor86 - Fr 20.06.03 17:56

Hi, wir haben jetzt das in der Schule nochmal bvesprochen und der Lehrer hat uns eine Lösung gegeben. Ich verstehe sie nicht ganz. (Vielleicht muss man da Mathe-Profi sein). Kann mir jemand erklären, was da genau passiert? Ich wäre ihm sehr dankbar.

Der Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
vigqua:ARRAY[1..26,1..26of char;

procedure TForm1.Button1Click(Sender: TObject);
var s, z, i, j :integer; 
begin
i:=0
for z:=1 to 26 do 
  begin 
  for s:=1 to 26-i do 
    vigqua[s,z]:=chr(s+64+i); 
  j:=0
  for s:=26-i+1  to 26 do 
    begin 
    j:=j+1
    vigqua[s,z]:=chr(64+j) 
    end
  i:=i+1
  end
for i:=1 to 26 do 
for j:=1 to 26 do
stringgrid.cells[i-1,j-1]:=vigqua[i,j];
end;


MfG Mentor

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


CenBells - Fr 20.06.03 18:13

mit diesem stück füllt er das stringgrid mit den buchstaben, die in vigqua an stelle [i,j] stehen.


Delphi-Quelltext
1:
2:
3:
for i:=1 to 26 do 
  for j:=1 to 26 do 
    stringgrid.cells[i-1,j-1]:=vigqua[i,j];


Mit folgendem füllt er das dreieck halt so, daß in zeile eins in das Alphabet normal abgetragen wird. Wenn zeile (z) gleich 2 ist, wird in spalte (s) 1 das b geschrieben. Bis zum 'Z'.
Wenn das soweit fertig ist, ist das letzte Feld noch frei. Das erste freie Feld ermittelt er mit s := 26-i+1 und da füllt er in das feld halt den buchstaben 64+j. Ist j = 1, dann wird das A eingefüllt, und so weiter und so fort...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  i:=0
  for z:=1 to 26 do begin 
    for s:=1 to 26-i do 
      vigqua[s,z]:=chr(s+64+i); 
    j:=0
    for s:=26-i+1 to 26 do begin 
      j:=j+1
      vigqua[s,z]:=chr(64+j) 
    end
    i := i+1;
  end;


[edit]@tino:Danke fürs einfügen der Delphi-tags [edit]
Gruß
Ken


Tweafis - Fr 20.06.03 18:29

Was hat denn dein Lehrer an meiner Funktion auszusetzen? Du musst sie evt. noch um + oder - 1 anpassen aber ads sollte ja kein Problem sein...