Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Port von Turbo Pascal zu Delphi
kehrenberger - Mi 10.10.07 00:04
Titel: Port von Turbo Pascal zu Delphi
Ich bin dabei ein 10 Jahre altes Turbo Pascal Programm nach Delphi zu portieren. In diesem Programm wird mehrfach von Text auf Grafikdarstellung und zurück geschalten. Ich möchte nun alle Ausgaben in einem TImage Objekt darstellen. Für TP Grafikfunktionen sind leicht Delphi Analoga zu finden, aber simple Textausgaben, wie write und writeln, machen mir Probleme. Meine Definition von write als Aufruf von TextOut() scheitert an der Definition der write Funktion mit unbestimmter Anzahl von Parametern und der Auswertung von Konstanten, Variablen, Operationen, Formatierungen, etc. Ich habe mit TVarRec, array of variant und VType experimentiert, aber ich bleibe immer wieder mit Compiler Fehlermeldungen hängen, die auf Typabweichungen bei Parametern hinweisen. Hier zunächst mein aktueller 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: 23:
| procedure writeg(const Args: array of TVarRec); var I: Integer; Result: string[80]; begin Result := ''; for I := 0 to High(Args) do with Args[I] do case VType of vtInteger: Result := Result + IntToStr(VInteger); vtChar: Result := Result + VChar; vtExtended: Result := Result + FloatToStr(VExtended^); vtString: Result := Result + VString^; vtPChar: Result := Result + VPChar; vtObject: Result := Result + VObject.ClassName; vtClass: Result := Result + VClass.ClassName; vtAnsiString: Result := Result + string(VAnsiString); vtCurrency: Result := Result + CurrToStr(VCurrency^); vtVariant: Result := Result + string(VVariant^); vtInt64: Result := Result + IntToStr(VInt64^); end; Outtext(Result); end; |
Ein Aufruf von writeg ('W',IntTostr(w),',',IntTostr(R),' '); wird mit der Compilerfehlermeldung, daß Konstanten nicht beim Aufruf einer Funktion mit offener Parameterliste verwendet werden können. Laut Erklärung der Fehlermeldung könnte das Problem durch Einfügen von [] erledigt werden, also writeg (['W',IntTostr(w),',',IntTostr(R),' ']);
Hatte jemand schon ein ähnliches Problem? Irgendwelche Tips? Natürlich möchte ich vermeiden, jeden Hunderter von write Aufrufen händisch modifizieren zu müssen...
Gruß,
Klaus
Moderiert von
Narses: Delphi-Tags hinzugefügt
Calculon - Mi 10.10.07 00:20
Hi,
ich bin mir jetzt echt nicht sicher, aber könnte dein Fehler nicht damit zusammenhängen, dass du deiner Prozedur ein dynamisches array als Konstante übergibst? Das klingt für mich nach Widerspruch. Das würde auch die Compilerfehlermeldung erlären: array [0..100] of irgendwas <-- wäre statisch
Gruß
Calculon
--
Christian S. - Mi 10.10.07 00:21
Hallo!
Je nachdem, wie sehr Programmoberfläche und Programmlogik bereits getrennt sind, wäre es vielleicht zu überlegen, eine "richtige" Windows-Anwendung zu erstellen und nicht eine DOS-Anwendung zu simulieren ;-)
Zu Deinem Problem: Die Delphi-Funktion Format sollte Dir eine große Hilfe sein.
Grüße
Christian
kehrenberger - Mi 10.10.07 00:29
Vielen Dank für die schnelle Antwort. Tja leider liegt darin das Problem, die Ausgaben sind eng mit der Logik verwoben und das Programm hat einige Zehn-Tausend Zeilen Code. Ich habe keine Zeit und Lust die Applikation von Grund auf neu zu programmieren...
Ich wüßte nicht, wie mir Format bei meinem Problem helfen könnte...
Christian S. - Mi 10.10.07 00:32
kehrenberger hat folgendes geschrieben: |
Ich wüßte nicht, wie mir Format bei meinem Problem helfen könnte... |
Eine Funktion die sowas kann:
Delphi-Quelltext
1:
| Format('%1d %2d %3s', [1, Integer(false), 'blah']); |
erscheint mir für Dein Problem sehr praktisch.
Narses - Mi 10.10.07 00:37
Titel: Re: Port von Turbo Pascal zu Delphi
Moin und :welcome: im Forum!
kehrenberger hat folgendes geschrieben: |
Irgendwelche Tips? Natürlich möchte ich vermeiden, jeden Hunderter von write Aufrufen händisch modifizieren zu müssen... |
Wie wäre es denn, wenn du z.B. in UltraEdit den Quelltext per RegEx-Match anpasst? Oder (stilgerecht :P) z.B. mit einem Perl-Script? :nixweiss:
cu
Narses
kehrenberger - Mi 10.10.07 00:40
Ja, ist klar, aber die Anzahl der Parameter muß bei Verwendung von Format in meiner Prozedur vorher bekannt sein. Sobald ich eine offene Parameterliste übergebe, treten die Fehler auf, unabhängig was ich dann in der Prozedur mache... Das heißt, ohne Modifikation der Aufrufe nix zu machen. Wie ist den write() programmiert? Gibt es dafür offenen Quellcode?
---
Narses, ja, das ist sicherlich möglich. Mich hätte nur interessiert, ob es auch eine einfache Möglichkeit ohne Ersetzen aller Aufrufe im gesamten Quelltext gibt. Bei write geht es ja auch!
Moderiert von
Narses: Beiträge zusammengefasst.
kehrenberger - Di 16.10.07 16:28
Nur zur Info für Leute, die ein ähnliches Problem haben. Mir hat {$APPTYPE CONSOLE} geholfen. Es wird ein Console Fenster aufgemacht, das alle write und writeln Ausgaben automatisch darstellt und übrigens auch für read Befehle benutzt werden kann. Danke nochmal für alle Replies.
Klaus
alzaimar - Di 16.10.07 18:14
Die korrekte Deklaration geht mit 'array of const'. Innerhalb der Prozedur ist dann Param[i] ein TVarRec.
Delphi-Quelltext
1: 2: 3: 4:
| Procedure Writeg (Param : Array Of Const); Begin ... End; |
Ich habe mir mal eine Funktion gebastelt, die das i.te Element eines 'array of const' liefert;
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:
| Function ElementOfConst(aIndex: Integer; aArray: Array Of Const): Variant; Begin With aArray[aIndex] Do Case VType Of vtInteger: Result := VInteger; vtBoolean: Result := vBoolean; vtChar: Result := VChar; vtExtended: Result := vExtended^; vtString: Result := VString^; vtPChar: Result := StrPas(VPChar); vtObject: Result := VObject.ClassName; vtClass: Result := VClass.ClassName; vtAnsiString: Result := String(VAnsiString); vtCurrency: Result := VCurrency^; vtVariant: Result := VVariant^; vtInt64: Result := VInt64^; End; End; |
Damit solltest Du klarkommen.
Grundsätzlich würde ich mal schauen, ob Du das TP-Programm nicht so ummodeln kannst, das Funktion und Darstellung getrennt sind. Dann kannst Du vielleicht die Darstellung an Win32 anpassen. Wichtig ist sowieso erstmal, das es funktioniert.
kehrenberger - Di 16.10.07 21:24
Vielen Dank. Ich habe Aehnliches schon versucht, aber es gab verschiedene Fehler mit falschen Typen, etc. Aber ich bin ja mit der Consolenloesung perfekt gefahren. Danke, nochmal.
Timosch - Di 16.10.07 21:43
kehrenberger hat folgendes geschrieben: |
Nur zur Info für Leute, die ein ähnliches Problem haben. Mir hat {$APPTYPE CONSOLE} geholfen. Es wird ein Console Fenster aufgemacht, das alle write und writeln Ausgaben automatisch darstellt und übrigens auch für read Befehle benutzt werden kann. Danke nochmal für alle Replies.
Klaus |
Das hätten wir dir von Anfang an sagen können, wenn wir verstanden hätten, dass das dein Problem ist. :shock: Ohne Konsole bringen die write und read-Befehle ja auch überhaupt nichts, außer in Bezug auf Dateien. Deine Problemschilderung oben deutete aber auf viel kompliziertere Probleme hin. :D
Du kannst übrigens auch in den Projektoptionen "Konsolenanwendung" einstellen oder bei einem neuen Projekt gleich Neu->Konsolenanwendung nehmen. Aber das nur zur Info.
kehrenberger - Di 16.10.07 21:53
Tja, wenn man die Antwort schon kennen wuerde, braeuchte man keine Frage zu stellen...;^) Aber ich habe meine Loesung ja bekommen, von daher hat sich mein Post hier gelohnt! Tolles Team.
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!