Autor Beitrag
kehrenberger
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 10.10.07 00:04 
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:


ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
kehrenberger Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 10.10.07 00:32 
user profile iconkehrenberger hat folgendes geschrieben:
Ich wüßte nicht, wie mir Format bei meinem Problem helfen könnte...
Eine Funktion die sowas kann:
ausblenden Delphi-Quelltext
1:
Format('%1d %2d %3s', [1, Integer(false), 'blah']); // wird "1, 0, blah"					

erscheint mir für Dein Problem sehr praktisch.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 10.10.07 00:37 
Moin und :welcome: im Forum!

user profile iconkehrenberger 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
kehrenberger Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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 user profile iconNarses: Beiträge zusammengefasst.
kehrenberger Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 16.10.07 18:14 
Die korrekte Deklaration geht mit 'array of const'. Innerhalb der Prozedur ist dann Param[i] ein TVarRec.

ausblenden 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;

ausblenden 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.

_________________
Na denn, dann. Bis dann, denn.
kehrenberger Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Di 16.10.07 21:43 
user profile iconkehrenberger 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.

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
kehrenberger Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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.