Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Inkompatible Typen
sevenscrime - Sa 25.04.09 17:13
Titel: Inkompatible Typen
Hallo , liebe Community!
Wahrscheinlich habt ihr shcon viele solcher Threads beantwortet , aber ich bekomm es einfach nicht hin es an meinem Programm zu berichtigen.Was noch zu sagen ist ich bin ein Anfänger ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button2Click(Sender: TObject); var zahl1,zahl2,zahl3,zahl4,zahl5,zahl6,zahl7,zahl8,zahl9,zahl10:integer;
begin zahl1:=17 ; zahl2:=98 ; zahl3:=55 ; zahl4:=32 ; zahl5:=9 ; zahl6:=69 ; zahl7:=46 ; zahl8:=72 ; zahl9:=13 ; zahl10:=88; zahl1:=stringgrid1.cells[0,0]:integer |
Eigentlich wollte ich eine zufällig generierte Zahl in ein Stringgrid einbinden , um dann damit weiterzuarbeite , um letzenendlich Bubblesort hinzubekommen.Nur hat das mit dem Random nicht geklappt , weshalb ich mir Zahlen vorgebe und so tue , als ob sie zufällig sind -.- .
Darum wäre ich euch sehr dankbar , wenn ihr mir beides lösen könntet.
Vielen Dank.
MFG
Dude566 - Sa 25.04.09 17:22
Du weist der Zelle im StringGrid garkeinen Wert zu, sondern der zahl1 den Wert in der Zelle(0/0).
Zufallszahlen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.RandomClick(Sender: TObject); var zahl : integer; begin randomize; zahl := random(10)+1; Edit1.Text := IntToStr(zahl); end; |
Bubblesort
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var zufall : array [1..100] of integer; for i := 1 to 100 do for j := 1 to 99 do if zufall[j] > zufall[j+1] then begin hilf := zufall[j]; zufall[j] := zufall[j+1]; zufall[j+1] := hilf; end; for i := 1 to 100 do ListBox1.Items.Add(IntToStr(zufall[i])); |
sevenscrime - Sa 25.04.09 19:02
Und wie kann ich eine zufällig bestimmte Zahl einer Zelle im Stringgrid zuweisen?Oder gleich mehrere?
MFG
Xabitire - Sa 25.04.09 19:33
Hallo und :welcome: im Forum.
Geh einfach mit Hilfe von for-Schleifen, jede Zelle des Stringgrids durch und schreibe eine Zufallszahl rein.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var x, y: Integer; begin Randomize;
for x := 0 to StringGrid1.ColCount - 1 do for y := 0 to StringGrid1.RowCount - 1 do StringGrid1.Cells[x,y] := IntToStr(Random(10) + 1; |
Wenn du allerdings einer Zelle mehrere Zahlen zuweisen willst oder nicht immer zwischen String und Integer/Double/etc. hin und her konvertieren willst solltest du ein mehrdimensionales Array benutzen, dessen Inhalt du dann jeweils, wenn benötigt, im Stringrid ausgibst. Das erspart dem Computer dann auch unnötige Rechenarbeit :wink:
Mit freundlichen Grüßen
Blackbird8690
sevenscrime - Sa 25.04.09 21:03
Danke euch , nur kommt jetztfolgende Fehlermeldung ( hat die SuFu benutzt ;) ):
Nicht genügend wirkliche Parameter.
1. was ist das?
2. wie kann ich es verbessern?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button2Click(Sender: TObject); var i,j,c:integer; begin for i:=1 to 10-1 do begin for j:=10 downto i do begin if stringgrid1.cells[j]<stringgrid1.Cells[j-1] then begin c:=stringgrid1.cells[j-1]; stringgrid1.cells[j-1]:=stringgrid1.cells[j]; stringgrid1.Cells[j]:=c; end; end; end; |
MFG, danke.
GTA-Place - Sa 25.04.09 21:30
Nun, eine Zelle hat doch X- und Y-Koordinaten, oder nicht? ;)
Also zum Beispiel
1:
| StringGrid1.Cells[I, J] := C; |
Außerdem solltest du keine festen Werte für die For-Schleife nehmen, sondern die Anzahl der Zellen.
sevenscrime - Sa 25.04.09 21:58
Vielen Dank , klappt jetzt soweit.Delphi zeigt keinen Fehler mehr an , nur , wenn ich jetzt das Project starte und mir erstmal mein zufälligen zahlen hole ( indem ich auf den button1 klicke) passiert alles wie es soll , aber , wenn ich auf button 2 klicke kommt eine fehler meldung : "ist kein gültiger integer wert.
Hier der aktuelle Quellcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TForm1.Button1Click(Sender: TObject); var x, y: Integer; begin Randomize;
for x := 0 to StringGrid1.ColCount - 1 do
for y := 0 to StringGrid1.RowCount - 1 do StringGrid1.Cells[x,y] := IntToStr(Random(100) + 1);
end;
procedure TForm1.Button2Click(Sender: TObject); var i,j,c:integer; begin for i:=1 to 10-1 do begin for j:=10 downto i do begin if stringgrid1.cells[j,0]<stringgrid1.Cells[j-1,0] then begin
stringgrid1.cells[j-1,0]:=inttostr(c); stringgrid1.cells[j-1,0]:=stringgrid1.cells[j,0]; c:=strtoint(stringgrid1.cells[j,0]); end; end; end;
end; |
Hat jemand ne Idee?
Ich vermute ,dass es an dem c und dem stringgrid liegt , weiß aber nichts genaueres.
MFG
Martok - Sa 25.04.09 23:37
Nur geraten, wäre aber logisch:
GTA-Place hat folgendes geschrieben : |
Außerdem solltest du keine festen Werte für die For-Schleife nehmen, sondern die Anzahl der Zellen. |
Xabitire - Sa 25.04.09 23:51
Stringgrid-Zellen sind vom Typ String, dass heißt du musst den Inhalt für einen Vergleich wieder in Integer umwandeln. Also:
Delphi-Quelltext
1:
| StrToInt(stringgrid1.cells[x,y]) |
statt nur
Delphi-Quelltext
1:
| stringgrid1.cells[x,y] |
sevenscrime - So 26.04.09 00:38
So hab das genannte übernommen , nur ist jetzt mein Problem , dass ich , wenn ich das Project starten will nur den grauen Hintergrund des Fensters zu sehen bekomme.Formular und Quellcode ist da, das hab ich nachgeguckt.
Was nun?
MFG
FinnO - So 26.04.09 11:21
schauen ob Stringgrid.Visible im Objektinspektor True ist.
sevenscrime - So 26.04.09 12:17
Tform1 war nicht auf visible true. Hab das nun geändert , aber es ist immer noch nichts zu sehen ( man kann auch auf nichts klicken -.-).
MFG
Delete - So 26.04.09 12:20
sevenscrime hat folgendes geschrieben : |
Tform1 war nicht auf visible true. Hab das nun geändert , aber es ist immer noch nichts zu sehen ( man kann auch auf nichts klicken -.-).
MFG |
Es ist gar nichts zusehen? Dann überprüfe mal , ob du sonst irgendwo im Code Form1 auf Visible := false gesetzt hast-
Jakob_Ullmann - So 26.04.09 12:53
Oder poste am besten mal den Code.
sevenscrime - So 26.04.09 13:00
Nee , hab ich nicht.
Hier der komplette Code nochmal:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| unit bubblesort;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; StringGrid1: TStringGrid; procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button3Click(Sender: TObject); begin close; end;
procedure TForm1.Button1Click(Sender: TObject); var x, y: Integer; begin Randomize;
for x := 0 to StringGrid1.ColCount - 1 do
for y := 0 to StringGrid1.RowCount - 1 do StringGrid1.Cells[x,y] := IntToStr(Random(100) + 1);
end;
procedure TForm1.Button2Click(Sender: TObject); var i,j,c:integer; begin for i:=1 to 10-1 do begin for j:=10 downto i do begin if stringgrid1.cells[j,0]<stringgrid1.Cells[j-1,0] then begin strtoint:=stringgrid1.cells[j-1,0]; stringgrid1.cells[j-1,0]:=inttostr(c); stringgrid1.cells[j-1,0]:=stringgrid1.cells[j,0]; c:=strtoint(stringgrid1.cells[j,0]); end; end; end;
end;
end. |
Normalerweise müsste er jetzt ja , wenn ich die zufälligen zahlen erstellt habe (per maus-klick) dann müsste ich ja per mausklick auf den entsprechenden button sehen ( mehr oder weniger) , wie die Zahlen vertauscht werden . Das kann ich aber nicht . Was muss ich also machen??
PS:Fragt mich nicht woher ich weiß , dass es nicht so ist irgendwie hab ich mal dies und das gemacht und dann konnte ich es sehen , aber es klappt immer noch nicht , das Starten des Programmes.
MFG , danke.
Jakob_Ullmann - So 26.04.09 13:02
Bitte bearbeite den Thread nochmal und mache aus dem [delphi] ein [delphi]. Danke!
edit: Mist, zu spät.
jaenicke - Mo 27.04.09 07:23
Die fehlen offensichtlich die alleruntersten Grundlagen, deshalb einmal der Hinweis auf diesen sehr guten Crashkurs:
http://crashkurs.christian-stelzmann.de
und die neue Version speziell ab Turbo Delphi:
http://www.christian-stelzmann.de/index_tutorials_crashkurs_reloaded.html
Ein weiteres gutes Online-Buch:
http://de.wikibooks.org/wiki/Programmierkurs:_Delphi
Dann zu dem geposteten Quelltext:
sevenscrime hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4:
| strtoint:=stringgrid1.cells[j-1,0]; stringgrid1.cells[j-1,0]:=inttostr(c); stringgrid1.cells[j-1,0]:=stringgrid1.cells[j,0]; c:=strtoint(stringgrid1.cells[j,0]); | |
In der ersten Zeile benutzt du StrToInt. Dies ist eine Funktion, die dir einen Wert zurückgibt. Also so wie IntToStr, das du in der nächsten Zeile benutzt.
In der zweiten Zeile benutzt du jetzt c, allerdings hast du dieser Variablen noch gar keinen Wert zugewiesen...
In der vierten Zeile weist du jetzt c einen Wert zu, danach wird c allerdings in diesem Schleifendurchlauf gar nicht mehr verwendet.
Dann noch zu deiner if-Abfrage:
Delphi-Quelltext
1:
| if stringgrid1.cells[j,0]<stringgrid1.Cells[j-1,0] then |
Du vergleichst so zwei Strings, aber nicht die Zahlenwerte darin.
Zwei Werte austauschen geht prinzipiell so, der erste Wert wird zwischengespeichert in einer Variablen, dann bekommt der den neuen Wert und am Ende der zweite Wert den zwischengespeicherten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var temp: String; begin Temp := StringGrid1.Cells[j-1, 0]; StringGrid1.Cells[j-1, 0] := StringGrid1.Cells[j, 0]; StringGrid1.cells[j, 0] := Temp; |
thepaine91 - Mo 27.04.09 09:52
Hab auch mal eine Frage zu deiner if Abfrage und zwar warum machst du folgendes
bezogen auf [ 10 - 1 ] warum rechnest du in einer for schleife mit 2 Konstanten?
Kostet eig. nur unnötige Rechenleistung. D.h. gleich 9 schreiben. :P
Delphi-Quelltext
1:
| strtoint:=StringGrid1.cells[1,1]; |
Diese Zeile ist für mich unverständlich.
Und davon abgesehn kann ich mir nicht vorstellen das du da keine Fehlermeldung bekommst? Oo
jaenicke - Mo 27.04.09 10:32
thepaine91 hat folgendes geschrieben : |
bezogen auf [ 10 - 1 ] warum rechnest du in einer for schleife mit 2 Konstanten?
Kostet eig. nur unnötige Rechenleistung. |
Nein, das stimmt nicht, es sieht nur unübersichtlicher aus, aber Delphi rechnet sowas schon beim Kompilieren aus und optimiert die Schleife. Von der Laufzeit her ist es also völlig egal wie man das schreibt.
thepaine91 hat folgendes geschrieben : |
Und davon abgesehn kann ich mir nicht vorstellen das du da keine Fehlermeldung bekommst? Oo |
Da kommt ja auch eine, das ist klar, das halten viele nur offenbar nicht für wichtig zu erwähnen was nicht klappt...
thepaine91 - Mo 27.04.09 10:41
Zum 1. wieder was dazu gelernt. Danke dafür @jeanicke =)
Zum 2. Ich sehe das etwas anders denn ist er offensichtlich ein Anfänger und da denke ich sollte man das erwähnen.
Weis ja nicht was er sich dabei gedacht hat. Meine Vermutung wäre das er denkt damit wandelt er im Programm alle
string werte im strgrid dauerhaft in Integer um. War vil. aber auch einfach ein Flüchtigkeitsfehler.
Und er sagte ja auch das es nicht Funktioniert also Weise ich ihn netter weise darauf hin.
jaenicke - Mo 27.04.09 11:03
Ich meinte das:
sevenscrime hat folgendes geschrieben : |
aber es klappt immer noch nicht , das Starten des Programmes. |
Dass sich das so nicht kompilieren lässt, scheint also durchaus klar zu sein, aber die Fehlermeldung fehlte in dem Post. ;-)
thepaine91 - Mo 27.04.09 12:15
Achso okay =)
Jap aber wie du sagtest ist das warscheinlich trotzdem jedem aufgefallen das das eine geben wird.
Und erübrigt sich somit.
@Sevenscrime für die Zukunft wenn du sagst dein Programm funktioniert nicht,
solltest du auch den Fehler genauer zu spezifizieren.
Dann werden sich sicher auch mehr User mit deinem Problem beschäftigen.
Delphi-Quelltext
1: 2:
| stringgrid1.cells[j-1,0]:=inttostr(c); c:=strtoint(stringgrid1.cells[j,0]); |
Diese Hinweise/Warnungen solltest du nicht Ignorieren. Falls du damit nicht klarkommst kannst du ja gerne Fragen dazu stellen. Obwohl sie eigentlich ziemlich Aussagekräftig sind.
desweiteren glaube ich war folgendes doch ein Flüchtigkeitsfehler:
Delphi-Quelltext
1: 2: 3: 4:
| strtoint:=stringgrid1.cells[j-1,0]; stringgrid1.cells[j-1,0]:=inttostr(c); stringgrid1.cells[j-1,0]:=stringgrid1.cells[j,0]; c:=strtoint(stringgrid1.cells[j,0]); |
So hast du es warscheinlich gedacht:
Delphi-Quelltext
1: 2: 3: 4:
| c := strtoint(stringgrid1.cells[j-1,0]); stringgrid1.cells[j-1,0]:=stringgrid1.cells[j,0]; stringgrid1.cells[j,0]:=inttostr(c); |
Entweder hast du wirklich so wenig Ahnung von Delphi und konntest das nicht lösen oder du bist Faul.
Kannst eig. Froh sein das überhaupt jemand darauf Antwortet und dich nicht einfach nur auf einen
Delphi crashkurs verweist. Aber vil Irre ich mich ja.
mfg nic
mfg nic
jaenicke - Mo 27.04.09 12:26
So funktioniert das allerdings auch noch nicht. ;-)
thepaine91 hat folgendes geschrieben : |
Delphi-Quelltext 1:
| strtoint(c) :=stringgrid1.cells[j-1,0]; | |
Wie es richtig geht hatte ich doch schon geschrieben:
jaenicke hat folgendes geschrieben : |
Zwei Werte austauschen geht prinzipiell so, der erste Wert wird zwischengespeichert in einer Variablen, dann bekommt der den neuen Wert und am Ende der zweite Wert den zwischengespeicherten: Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var temp: String; begin Temp := StringGrid1.Cells[j-1, 0]; StringGrid1.Cells[j-1, 0] := StringGrid1.Cells[j, 0]; StringGrid1.cells[j, 0] := Temp; | |
thepaine91 - Mo 27.04.09 13:25
Sorry hab ich übersehen, hab es mal auf seinen Quelltext bezogen um zu besser zu zeigen was falsch war.
Eigentlich ist es genau das selbe und es funktioniert.
Wie oben gesagt dadurch das ich versucht habe seine Fehler am quelltext deutlich zu machen habe ich
die Umwandlung [strtoint] und [inttostr] gemacht.
Andererseits lasse ich die bezeichnung falsch indirekt gelten. :-P
Denn so wird 2x eine typenumwandlung gemacht die nicht gebraucht wird.
Aber deshalb auch ( Zitat: " So hast du warscheinlich gedacht " :-) )
Hab mich ja auch in meinem letzten Post in den letzten 3 Zeilen dazu geäußert
jaenicke - Mo 27.04.09 13:32
Was ich meine ist, dass deine Zeile auch nicht kompiliert werden kann... ;-)
Ob mit oder ohne Parameter, einer Funktion (strtoint) kann man nix zuweisen.
thepaine91 - Mo 27.04.09 13:49
Vor lauter Bäumen den Wald nicht gesehen =)
Natürlich geht das nicht :autsch:
berichtige es gleich mal.
sevenscrime - Mo 27.04.09 19:38
Erstmal danke , für die vielen Antworten die haben mir wirklich geholfen.
Zitat: |
c:=stringgrid1.cells[j-1];
stringgrid1.cells[j-1]:=stringgrid1.cells[j];
stringgrid1.Cells[j]:=c; |
das war wirklich nur ein blöder Fehler , ist irgendwie klar ,dass das nicht klappen kann ;)
Dennoch bleibt eine Frage offen : Wie kann ich denn die Werte zweier Zellen vergleichen?
PS:Den Fehler , den Delphi angezeigt haben soll , hat es nur am Anfang angezeigt ( normalerweise ignoriere ich Hinweise und Warnungen , weil es keine Fehler sind , dumm ich weiß :P ), später , als das Programm nicth gestartet hat nicht mehr.
MFG
Jakob_Ullmann - Mo 27.04.09 20:30
Vergleichen: Dafür gibt es <, >, <>, <=, >=. Zum Beispiel:
Delphi-Quelltext
1: 2:
| if a < b then ShowMessage('a ist kleiner als b.'); |
Bezogen auf dein StringGrid musst du die Zellinhalte, welche ja als Zeichenketten (string => str) vorliegen, erst in (to) Zahlen (integer => int) oder float für Kommazahlen umwandeln. Du kannst also entweder schreiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var a, b: Extended; begin a := StrToFloat(StringGrid1.Cells[0,0]); b := StrToFloat(StringGrid1.Cells[1,0]); if a < b then ShowMessage('a kleiner als b.'); if StrToFloat(StringGrid1.Cells[0,0]) < StrToFloat(StringGrid1.Cells[1,0]) then ShowMessage('a kleiner als b.'); end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!