|
Antwort |
Registriert seit: 29. Nov 2006 13 Beiträge Delphi 7 Personal |
#1
Hallo zusammen,
ich habe ein kleines Problem. Ich möchte in ein Edit Feld eine Zahl von 1-10 eingeben. Diese Zahl soll nach Betätigung des OK. Button in ein Label geschrieben werden. Dann soll der Eingabefocus wieder in das Edit Feld gelegt werden. Bis hierhin bin ich gekommen. Jetzt soll die nächste Zahl von 1-10 eingegeben werden. Die neue Zahl soll nun in das Label der vorherigen Zahl geschrieben werden. Und so weiter. Wenn das letzte der 10 Labels mit Zahlen gefüllt ist, soll die zuerst eingegebene Zahl verschwinden und die elfte Zahl oben erscheinen. Aus diesen Zahlen soll nun jeweils ermittelt werden, ob zwei Zahlen identisch(Zwillinge) sind. Der erste Zwilling soll nun in das erste Label mit Namen Zwilling geschrieben werden. Dann soll so vorgegangen werden wie bei den anderen Zahlen, die Zwillinge sollen weiter nach unten wandern. Aus den Zwillingen sollen Drillinge ermittelt werden, ansonsten wie vor. Zum schluss sollen aus den Drillingen die Vierlinge ermittelt werden. Und das alles immer fortlaufend. Zur besseren Übersicht habe ich mal den bisherigen Quellcode beigefügt. Wäre schön, wenn mir jemand helfen könnte. Vielen Dank.
Delphi-Quellcode:
[edit=SirThornberry]Delphi-Tags gesetzt - Mfg, SirThornberry[/edit]
unit Zwillinge;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Button1: TButton; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Zahl: Array [1..10] of Integer; Zwilling: Array [1..5] of Integer; Drilling: Array [1..3] of integer; Vierling: Array [1..2] of Integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin label1.Caption:=inttostr (Zahl[1]); end; end. |
Zitat |
Registriert seit: 6. Apr 2005 10.109 Beiträge |
#2
Herzlich willkommen in der Delphi-PRAXiS, rambospike.
Es wird alles viel einfacher für dich, wenn du erstmal einen groben Fahrplan aufstellst:
Zur Visualisierung schlage ich dir eine ListBox vor. Die Eingabe ersetze ich durch Zufallszahlen:
Delphi-Quellcode:
Das Sortieren der Zahlenwerte kannst du mit einem beliebigen Verfahren erledigen. Ich nehme jetzt mal den BubbleSort:
const
MAX_ITEMS = 20; // (1) Zahlen bereitstellen procedure Initialize(s: TStrings); begin with s do begin Clear; while Count < MAX_ITEMS do Add(IntToStr(Random(10))); end; end;
Delphi-Quellcode:
Die Zahlenwerte sind jetzt geordnet und gleiche Zahlen stehen direkt hintereinander. Um die Sortierung nach Kettenlänge in Schritt 4 zu vereinfachen führe ich eine Lauflängenverdichtung ein. Die Folge 0 0 0 0 0 ersetze ich durch 0 (5 mal). Den Wiederholungsfaktor verstecke ich in der Array-Eigenschaft Objects[] der ListBox.Items:
// (2) Nach Zahlwert sortieren
procedure BubbleSort(s: TStrings); var iInner, iOuter: Integer; begin with s do for iOuter := 1 to Pred(Count) do for iInner := Pred(iOuter) downto 0 do if StrToInt(Strings[iInner]) > StrToInt(Strings[Succ(iInner)]) then Exchange(iInner, Succ(iInner)) else Break; end;
Delphi-Quellcode:
Jetzt können wir den BubbleSort aus Schritt 2 leicht modifiziert verwenden um nach Lauflänge zu sortieren:
// (3) Kettenlängen bestimmen
procedure RLEncode(s: TStrings); var iInner, iOuter, iCount: Integer; begin with s do begin if Count > 0 then iOuter := 0 else Exit; while iOuter < Count do begin iCount := 1; iInner := Succ(iOuter); while (iInner < Count) and (Strings[iInner] = Strings[iOuter]) do begin Inc(iCount); Delete(iInner); end; Objects[iOuter] := Pointer(iCount); Inc(iOuter); end; end; end;
Delphi-Quellcode:
Du und ich wir wissen jetzt bereits, dass wir fertig sind, aber damit der Rest der Welt uns das auch glaubt, bauen wir die Anzeige noch um, so dass die Lauflänge in runden Klammern hinter der Zahl erscheint:
// (4) Nach Kettenlänge sortieren
procedure ChainSort(s: TStrings); var iInner, iOuter: Integer; begin with s do for iOuter := 1 to Pred(Count) do for iInner := Pred(iOuter) downto 0 do if Integer(Objects[iInner]) > Integer(Objects[Succ(iInner)]) then Exchange(iInner, Succ(iInner)) else Break; end;
Delphi-Quellcode:
Packe eine ListBox auf eine leere Form und verpasse der Form einen Event Handler für OnCreate():
// (5) Visualisierung
procedure Visualize(s: TStrings); var i: Integer; begin with s do for i := 0 to Pred(Count) do Strings[i] := Format('%s (%d)', [Strings[i], Integer(Objects[i])]); end;
Delphi-Quellcode:
Deine Aufgabe ist es jetzt, den Code Zeile für Zeile anhand der Delphi Online Hilfe nachzuvollziehen. Sobald du ihn verstanden hast, wirst du ihn an deine Aufgabe anpassen können. Baue noch eine Benutzerschnittstelle, die die einzelnen Schritte etwas entzerrt und du bist fertig.
procedure TDemoForm.FormCreate(Sender: TObject);
begin Randomize; Initialize(ListBox.Items); BubbleSort(ListBox.Items); RLEncode(ListBox.Items); ChainSort(ListBox.Items); Visualize(ListBox.Items); end; Freundliche Grüße vom marabu |
Zitat |
Registriert seit: 27. Apr 2006 Ort: Gieboldehausen 167 Beiträge |
#3
Hi
Erst mal Willkommen. Nun, deine Beschreibung ist, ehrlich gesagt etwas für die Glaskugel. Ich vermute mal, das du die Zeichen in Form einer Laufschrift durch die Labels wandern lassen möchtest und wenn 2, 3 oder 4 auftauchen dieses ebenfals in einer Laufschriftähnlichen Form anzeigen möchtest. Sag mir, wenn ich gut geraten habe, dann mach ich beim nächsten Mal weiter. Ich weiß, es ist nicht einfach, seine Aufgabe zu beschreiben, aber je besser du sie beschreiben kannst, un so mehr Probleme wirst du selbst lösen können. z. B. vorgehensweise beim Programmieren einer Laufschrift. Var Werte :Array[1..10] of integer;
Delphi-Quellcode:
nun schieben wir mal...
Procedure Arrayvorbesetzen;
Var i: Integer; Begin For i:=1 to 10 do Werte[i]:=0; End;
Delphi-Quellcode:
und andersrum schieben wäre
Procedure ArraySchieben(neuerWert: Integer);
Var i : Integer; begin For i:=2 to 10 do Werte[i-1]:=Werte[i]; // schiebt von oben nach unten... Werte[10]:=Neuerwert; // neuer Wert in 10. Feld Label1.Caption:=Werte[1]; Label2.Caption:=Werte[2]; Label3.Caption:=Werte[3]; usw end;
Delphi-Quellcode:
viel Spass noch
For i:=1 to 9 do Werte[10-i+1]:=Werte[10-i]; // schiebt von unten nach oben...
Wert1:=Neuwert; // neuer wert in 1.Feld Gruß oldmax
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !
|
Zitat |
Registriert seit: 29. Nov 2006 13 Beiträge Delphi 7 Personal |
#4
Zitat von oldmax:
Ich vermute mal, das du die Zeichen in Form einer Laufschrift durch die Labels wandern lassen möchtest und wenn 2, 3 oder 4 auftauchen dieses ebenfals in einer Laufschriftähnlichen Form anzeigen möchtest. Sag mir, wenn ich gut geraten habe, dann mach ich beim nächsten Mal weiter.
Gruß oldmax erst einmal vielen Dank für deine Antwort. Du hast vollkommen richtig geraten. Deine Beschreibung entspricht genau dem, was ich mir vorgestellt habe. Ich werde jetzt mal versuchen, mit deinem Code weiterzukommen. Vielen Dank nochmal. Herzliche Grüße von rambospike |
Zitat |
Registriert seit: 29. Nov 2006 13 Beiträge Delphi 7 Personal |
#5
Zitat von marabu:
Herzlich willkommen in der Delphi-PRAXiS, rambospike.
Es wird alles viel einfacher für dich, wenn du erstmal einen groben Fahrplan aufstellst:
Zur Visualisierung schlage ich dir eine ListBox vor. Die Eingabe ersetze ich durch Zufallszahlen:
Delphi-Quellcode:
Das Sortieren der Zahlenwerte kannst du mit einem beliebigen Verfahren erledigen. Ich nehme jetzt mal den BubbleSort:
const
MAX_ITEMS = 20; // (1) Zahlen bereitstellen procedure Initialize(s: TStrings); begin with s do begin Clear; while Count < MAX_ITEMS do Add(IntToStr(Random(10))); end; end;
Delphi-Quellcode:
Die Zahlenwerte sind jetzt geordnet und gleiche Zahlen stehen direkt hintereinander. Um die Sortierung nach Kettenlänge in Schritt 4 zu vereinfachen führe ich eine Lauflängenverdichtung ein. Die Folge 0 0 0 0 0 ersetze ich durch 0 (5 mal). Den Wiederholungsfaktor verstecke ich in der Array-Eigenschaft Objects[] der ListBox.Items:
// (2) Nach Zahlwert sortieren
procedure BubbleSort(s: TStrings); var iInner, iOuter: Integer; begin with s do for iOuter := 1 to Pred(Count) do for iInner := Pred(iOuter) downto 0 do if StrToInt(Strings[iInner]) > StrToInt(Strings[Succ(iInner)]) then Exchange(iInner, Succ(iInner)) else Break; end;
Delphi-Quellcode:
Jetzt können wir den BubbleSort aus Schritt 2 leicht modifiziert verwenden um nach Lauflänge zu sortieren:
// (3) Kettenlängen bestimmen
procedure RLEncode(s: TStrings); var iInner, iOuter, iCount: Integer; begin with s do begin if Count > 0 then iOuter := 0 else Exit; while iOuter < Count do begin iCount := 1; iInner := Succ(iOuter); while (iInner < Count) and (Strings[iInner] = Strings[iOuter]) do begin Inc(iCount); Delete(iInner); end; Objects[iOuter] := Pointer(iCount); Inc(iOuter); end; end; end;
Delphi-Quellcode:
Du und ich wir wissen jetzt bereits, dass wir fertig sind, aber damit der Rest der Welt uns das auch glaubt, bauen wir die Anzeige noch um, so dass die Lauflänge in runden Klammern hinter der Zahl erscheint:
// (4) Nach Kettenlänge sortieren
procedure ChainSort(s: TStrings); var iInner, iOuter: Integer; begin with s do for iOuter := 1 to Pred(Count) do for iInner := Pred(iOuter) downto 0 do if Integer(Objects[iInner]) > Integer(Objects[Succ(iInner)]) then Exchange(iInner, Succ(iInner)) else Break; end;
Delphi-Quellcode:
Packe eine ListBox auf eine leere Form und verpasse der Form einen Event Handler für OnCreate():
// (5) Visualisierung
procedure Visualize(s: TStrings); var i: Integer; begin with s do for i := 0 to Pred(Count) do Strings[i] := Format('%s (%d)', [Strings[i], Integer(Objects[i])]); end;
Delphi-Quellcode:
Deine Aufgabe ist es jetzt, den Code Zeile für Zeile anhand der Delphi Online Hilfe nachzuvollziehen. Sobald du ihn verstanden hast, wirst du ihn an deine Aufgabe anpassen können. Baue noch eine Benutzerschnittstelle, die die einzelnen Schritte etwas entzerrt und du bist fertig.
procedure TDemoForm.FormCreate(Sender: TObject);
begin Randomize; Initialize(ListBox.Items); BubbleSort(ListBox.Items); RLEncode(ListBox.Items); ChainSort(ListBox.Items); Visualize(ListBox.Items); end; Freundliche Grüße vom marabu vielen Dank für deine Hilfe. Du hast dir für einen Anfänger wie mich wirklich viel Mühe gegeben. Ich werde versuchen, nach deinen Vorgaben vorzugehen. Ich hoffe, dass es mir gelingt. Nochmals vielen Dank herzliche Grüße von rambospike |
Zitat |
Registriert seit: 29. Nov 2006 13 Beiträge Delphi 7 Personal |
#6
Zitat von rambospike:
Zitat von oldmax:
Ich vermute mal, das du die Zeichen in Form einer Laufschrift durch die Labels wandern lassen möchtest und wenn 2, 3 oder 4 auftauchen dieses ebenfals in einer Laufschriftähnlichen Form anzeigen möchtest. Sag mir, wenn ich gut geraten habe, dann mach ich beim nächsten Mal weiter.
Gruß oldmax erst einmal vielen Dank für deine Antwort. Du hast vollkommen richtig geraten. Deine Beschreibung entspricht genau dem, was ich mir vorgestellt habe. Ich werde jetzt mal versuchen, mit deinem Code weiterzukommen. Vielen Dank nochmal. Herzliche Grüße von rambospike ich habe deinen Code im Programm eingegeben, doch beim Compilieren kommt die Meldung: Undefinierter Bezeichner: 'Label2' , Label3 usw. Ich schicke nochmal den Code zur Prüfung, vielleicht findest du ja den Fehler. Vielen Dank. herzliche Grüße von rambospike unit Zwillinge; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Button1: TButton; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Zahl: Array [1..10] of Integer; Zwilling: Array [1..5] of Integer; Drilling: Array [1..3] of integer; Vierling: Array [1..2] of Integer; implementation {$R *.dfm} Procedure Arrayvorbesetzen; Var a: Integer; Begin For a:=1 to 10 do Zahl[a]:=0; End; Procedure ArraySchieben(neuerWert: Integer); Var a : Integer; begin For a:=2 to 10 do Zahl[a-1]:=Zahl[a]; // schiebt von oben nach unten... Zahl[10]:=Neuerwert; // neuer Wert in 10.Feld Label2.Caption:=inttostr (Zahl[1]); Label3.Caption:=inttostr (Zahl[2]); Label4.Caption:=inttostr (Zahl[3]); Label5.Caption:=inttostr (Zahl[4]); Label6.Caption:=inttostr (Zahl[5]); Label7.Caption:=inttostr (Zahl[6]); Label8.Caption:=inttostr (Zahl[7]); Label9.Caption:=inttostr (Zahl[8]); Label10.Caption:=inttostr (Zahl[9]); Label11.Caption:=inttostr (Zahl[10]); end; procedure TForm1.Button1Click(Sender: TObject); begin end; end. |
Zitat |
Registriert seit: 6. Apr 2005 10.109 Beiträge |
#7
Hallo,
Zitat von rambospike:
... ich habe deinen [oldmax] Code im Programm eingegeben, doch beim Compilieren kommt die Meldung: Undefinierter Bezeichner: 'Label2' , Label3 ...
Delphi-Quellcode:
Das ist nur eine Möglichkeit - es gibt auch noch andere.
type
TForm1 = class(TForm) Label2: TLabel; // ... private procedure ArraySchieben (neuerWert: Integer); // ... end; implementation // ... procedure TForm1.ArraySchieben (neuerWert: Integer); var a: Integer; begin for a := 2 to 10 do Zahl[a - 1] := Zahl[a]; // schiebt von oben nach unten... Zahl[10] := Neuerwert; // neuer Wert in 10.Feld Label2.Caption := IntToStr (Zahl[1]); // ... Label11.Caption := IntToStr (Zahl[10]); end; Freundliche Grüße |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |