Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Altes Programm kompilieren (https://www.delphipraxis.net/214425-altes-programm-kompilieren.html)

Runningdog 9. Jan 2024 19:10

Altes Programm kompilieren
 
Hallo liebe Forenmitglieder,

ich bin ein alter Sack und habe vor vielen Jahren mit Turbo-Delphi programmiert. Ich glaube es war Version 10 von 2005 oder 2006. Damals habe ich ein Programm geschrieben, wo ich das Kalenderdatum der Datensätze mit einer Function in eine Realzahl umgewandelt habe, weil das einfach leichter zu sortieren war (Damals waren die entsprechenden Funktionen noch nicht Bestandteil von Turbo-Delphi und mußten selbst geschrieben werden). Zu allem Übel stammt die Sortierfunction aus einem noch sehr viel älteren Turbo-Pascal von 19xx...

Nun funktioniert das Programm seit 2024 nicht mehr, weil wahrscheinlich die Realzahlen sich nun außerhalb der vorgesehenen Grenzen (der Funktion) bewegen. Damals hätte ich ja nie geglaubt, daß ich das Programm so lange benutze. Ich müßte da also am Programm was ändern.

Leider programmiere ich schon laaange nicht mehr und habe auch das Turbo-Delphi nicht mehr. Ich habs zwar im Internet-Archive noch gefunden, es läßt sich aber wegen der

The following prerequisites are included and must be installed beforehand:

– Microsoft Visual J#.NET Redistributable Package 1.1 (1.1.4322.586)
– Microsoft .NET Framework 1.1 Package (1.1.4322.573)
– Microsoft .NET Framework Service Pack 1 (KB867460) (1.0.871.2738)
– Microsoft .NET Framework SDK 1.1 Package (1.1.4322.591)
– Internet Explorer and Internet Tools Service Pack 1 (6.0.2800.1106)
– MSXML 4.0 SP2 Parser and SDK

nicht auf Windows 11 installieren. Dann hab ich Lazarus installiert, aber das kann mein Programm nicht kompilieren. Was meint ihr, könnte wohl ein aktuelles Turbo-Delphi mein Programm öffnen und kompilieren? Ich meine gelesen zu haben, daß es eine aktuelle Version gibt, die für den „Hausgebrauch“ kostenlos ist.

Gausi 10. Jan 2024 06:00

AW: Altes Programm kompilieren
 
Die für nicht-kommerzielle Zwecke kostenlos nutzbare Version heißt jetzt "Community Edition". Programme, die mit Turbo Delphi erstellt wurden, sollten auch mit der aktuellen CE kompilierbar sein.

Größte Stolperstelle dürfte die Umstellung bei den Strings sein. Vor Delphi 2009 war der Standard-String ein "AnsiString" (d.h. 1 Byte pro Zeichen), seitdem ist es ein "UnicodeString" (d.h. 2 Byte pro Zeichen).

haentschman 10. Jan 2024 06:03

AW: Altes Programm kompilieren
 
Willkommen...:dp:
Zitat:

daß es eine aktuelle Version gibt, die für den „Hausgebrauch“ kostenlos ist.
...ja gibt es. Nennt sich Community Edition. 😎 https://www.embarcadero.com/de/produ.../free-download

himitsu 10. Jan 2024 13:06

AW: Altes Programm kompilieren
 
Und bezüglich Delphi-Code im Lazarus.

Erstmal arbeitet Lazarus, bzw. FreePascal, standardmäßig mit einer etwas anderen Syntax, aber das läßt sich umstellen.
https://wiki.freepascal.org/Mode_Delphi

Und natürlich sind auch nicht alle Funktionen und Komponenten 100% identisch, sowie Manches liegt auch in anderen Units,
so dass es schon passieren kann, dass man hier und da bissl was anpassen muß (mindestens).


Ich weiß garnichts, ob man Delphi-Forms auch noch konvertieren muß, denn die .DFM heißen in Lazarus ja standardmäßig .LFM

Runningdog 10. Jan 2024 14:27

AW: Altes Programm kompilieren
 
Zitat:

Zitat von himitsu (Beitrag 1531738)
Und bezüglich Delphi-Code im Lazarus.

Und natürlich sind auch nicht alle Funktionen und Komponenten 100% identisch, sowie Manches liegt auch in anderen Units,
so dass es schon passieren kann, dass man hier und da bissl was anpassen muß (mindestens).

Ja, das merke ich gerade :-(
Habe gerade nochmal versucht, mein Programm in ein Lazarus-Projekt zu konvertieren. Der Kompiler meckert schon im interface-Teil , daß er CmAdmCtl, Mask, HTTPApp, HTTPProd nicht finden kann. Hab ich einfach mal zum Testen ausgeklammert, aber die nächste Fehlermeldung folgt schon gleich wenige Zeilen danach, wo er mit TDateTimePicker nichts anfangen kann.

Neee, das wird wohl nichts...

Habe auch schon viel zu viele Jahre nicht mehr programmiert, daß ich da jetzt auch noch eine Konvertierung hinbekommen soll. Meine nächste Idee wäre, auf einem Rechner nochmal Windows 7 zu installeieren, damit ich das alte Turbo-Delphi irgendwie zum laufen bringe. Aber der Aufwand?

Runningdog 10. Jan 2024 14:34

AW: Altes Programm kompilieren
 
Nachbemerkung: Bei einem ganz einfachen Programm von damals hat die Konvertierung von Turb-Delphi nach Lazarus ohne Probleme funktioniert, aber dieses kleine Programm hat auch nur ein paar dutzend Zeilen Code im Gegensatz zu dem Programm, um das es hier geht. Bin für jeden Tipp dankbar.

himitsu 10. Jan 2024 15:34

AW: Altes Programm kompilieren
 
Prinzipiell ist die aktuelle "Community Edition" das, was früher mal die "Starter" war und davor das kostenlose "Turbo Delphi Explorer".

Turbo Delphi war Delphi 2006 (vielleicht auch die zweite Version noch 2007)
Für 2006 gibt es bei Embarcadero nicht mehr das Setup und die ISO zum Download (nur alles ab 2007 und zusätzlich noch D7).

Unterschied ist aber, dass diese Lizenz jetzt nur noch ein Jahr läuft. Danach muß sie verlängert werden, sonst startet Delphi nicht mehr. Und gibt es eine neue CE-Version, muß sie installiert werden, da man immer nur für's Aktuelle eine Lizenz bekommt.
Ansonsten fehlt, wie schon bei den Turbos, der Commandline-Compiler und die meisten Quellcodes (PAS von RTL/VCL/FMX/usw.).

milo 10. Jan 2024 15:40

AW: Altes Programm kompilieren
 
Ob sich der Aufwand mit Windows 7 für Dich lohnt, können wir schlecht von hier aus beurteilen. Wenn Du den Aufwand einer Lazarus und/oder einer Community Edition nicht scheust, dann würde ich es an Deiner Stelle mit einer Virtuellen Windows 7 Installation in einer VirtualBox probieren. Das hätte den Vorteil, dass Du jederzeit wieder damit arbeiten könntest um es neu zu kompilieren.

Just my 2 Cents ...

Runningdog 10. Jan 2024 17:26

AW: Altes Programm kompilieren
 
So, ich habe jetzt das kostenlose Delphi installiert. Das alte Programm zu öffnen war kein Problem, aber laufen tut es nicht. Die Datensätze haben folgende Struktur:

Delphi-Quellcode:
type
      Daten = packed Record
      Datum : String[10];
       Text : String[50];
     Betrag : Double;
      Wert1 : String[1];
        Typ : String[1];
              End;
Und genau so werden sie auch auf dem Datenträger abgespeichert, d.h. ich kann das nicht einfach ändern, weil sonst die Daten nicht mehr gelesen werden können. Wie schon gesagt wurde, meckert der Copmpiler jetzt wegen der inkompatibilität von Char und AnsiChar:

Form1.BArt.Caption:= Decode(AktZeiger^.Satz.Typ[1]);

Fehlermeldung:
[dcc32 Fehler] Unit1.pas(563): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'

Würde ich das Programm nur für mich einsetzen, könnte ich ein kleines Tool machen, um die Datensätze zu konvertieren, aber leider geht das nicht. Wie könnte ich das Problem lösen? Bitte um Entschuldigung, ist wahrscheinlich banal, aber ich habe beinahe 20 Jahre nicht mehr programmiert. Also schon mal vielen Dank.

himitsu 10. Jan 2024 17:43

AW: Altes Programm kompilieren
 
Der LongString-Typ "String" war bis D2006/D2007 ein AnsiString (in D1 noch ein ShortString)
und jetzt ist es seit D2009 ein UnicodeString.

Ausnahme sind ShortStrings, welche als String-mit-Länge deklariert sind ... diese waren und bleiben ShortString.

Wie ist Decode deklariert?
Ich vermute mal mit Char als Parameter, was früher ein AnsiChar war und nun ein WideChar ist.

Bei Zuweisungen zwischen Ansi und Unicode wird Delphi standardmäßig eine (deaktivierbare) "Warnung". (dass eventuell Informationen verloren gehen)
Ist aber z.B. der Parameter "explizit" Char/WideChar (z.B. VAR-Parameter), dann gibt es keine automatische Konvertierung.
-> Wntweder den Parameter als AnsiChar deklarieren oder vor Übergabe manuell nach Char oder WideChar casten.

Runningdog 10. Jan 2024 21:36

AW: Altes Programm kompilieren
 
Delphi-Quellcode:
Function DeCode(Wort:Char):String;

Begin
  Case Wort Of
  '1','A' : DeCode:= 'Bar';
  '2','B' : DeCode:= 'Einzug';
  '3','C' : DeCode:= 'Scheck';
  '4','D' : DeCode:= 'Kartenzahlung';
  '5','E' : DeCode:= 'Überweisung';
  '6','F' : DeCode:= 'Dauerauftrag'
  Else DeCode:= 'Unbekannt';
  End;
End;

jaenicke 10. Jan 2024 21:46

AW: Altes Programm kompilieren
 
Dann musst du nur Wort:Char in Wort:AnsiChar ändern.

Runningdog 11. Jan 2024 09:27

AW: Altes Programm kompilieren
 
Zitat:

Zitat von jaenicke (Beitrag 1531781)
Dann musst du nur Wort:Char in Wort:AnsiChar ändern.

Hat AnsiChar nicht 2 Byte anstelle von Char (meine ich gelesen zu haben)?
Dann lassen sich leider sämtliche Dateien nicht mehr einlesen.

Der schöne Günther 11. Jan 2024 09:46

AW: Altes Programm kompilieren
 
Hallo und Willkommen zurück in der Delphi-Welt!

Das Leben wird oft relativ einfach wenn du nur "docwiki [Suchwort]" in die Internet-Suchmaschine deines Vertrauens eingibst.

Für "docwiki AnsiChar" landet man direkt auf der offiziellen Delphi-Dokumentation:
https://docwiki.embarcadero.com/Libr...ystem.AnsiChar

Die sagt dann direkt:
Zitat:

Repräsentiert einen 1 Byte großen (8 Bit) Zeichentyp.

AnsiChar-Werte stellen auf Byte-Größe (8 Bit) ausgerichtete Zeichen dar. (...)

jaenicke 11. Jan 2024 10:09

AW: Altes Programm kompilieren
 
Zitat:

Zitat von Runningdog (Beitrag 1531793)
Hat AnsiChar nicht 2 Byte anstelle von Char (meine ich gelesen zu haben)?

Char ist seit Delphi 2009 Unicode und damit sind das 2 Byte, während AnsiChar nach wie vor 1 Byte hat. Shortstrings wie in deinem Record sind weiter AnsiStrings, von daher passt das.

Dein case würde aber mit beidem funktionieren. Insofern kannst du AnsiChar für die Funktion verwenden oder das Zeichen mit Decode(Char(AktZeiger^.Satz.Typ[1])) vorher umwandeln.

Runningdog 11. Jan 2024 10:32

AW: Altes Programm kompilieren
 
Zitat:

Zitat von jaenicke (Beitrag 1531796)
Zitat:

Zitat von Runningdog (Beitrag 1531793)
Hat AnsiChar nicht 2 Byte anstelle von Char (meine ich gelesen zu haben)?

Char ist seit Delphi 2009 Unicode und damit sind das 2 Byte, während AnsiChar nach wie vor 1 Byte hat. Shortstrings wie in deinem Record sind weiter AnsiStrings, von daher passt das.

Dein case würde aber mit beidem funktionieren. Insofern kannst du AnsiChar für die Funktion verwenden oder das Zeichen mit Decode(Char(AktZeiger^.Satz.Typ[1])) vorher umwandeln.

Ok, werde ich probieren. Dann gibt es hier noch eine Fehlermeldung, die offensichtlich mit der Chr-Funktion zusammenhängt.

AktZeiger^.Satz.Typ[1]:= Chr(Ord(AktZeiger^.Satz.Typ[1])+16);

Da kommt auch wieder der Fehlercode Inkompatible Type: AnsiChar und Char

Übrigens: Wenn ich die Fehlerzeilen auskommentiere (die Funktionen sind zum Testen nicht so wichtig) läuft das Programm :-) das heißt, das heißt, daß ich dann die fehlerhafte Sortierfunktion in Angiff nehmen kann, die seit 2024 nicht mehr funktioniert. Da werde ich mich wohl wieder richtig reinlesen müssen in Delphi. Jetzt wo ich weiß, daß ich es wieder kompilieren kann. Und ich bedanke mich recht herzlich bei den Helfern hier im Forum, man hat es nach so vielen Jahren ja wirklich nicht leicht.

jaenicke 11. Jan 2024 10:44

AW: Altes Programm kompilieren
 
In der anderen Richtung sollte AnsiChar statt Chr funktionieren. Du kannst auch AnsiChar(Chr(... verwenden, aber die Umwandlung in einen Char ist dort nicht nötig.

Runningdog 11. Jan 2024 11:06

AW: Altes Programm kompilieren
 
Zitat:

Zitat von jaenicke (Beitrag 1531798)
In der anderen Richtung sollte AnsiChar statt Chr funktionieren. Du kannst auch AnsiChar(Chr(... verwenden, aber die Umwandlung in einen Char ist dort nicht nötig.

Tschuldige, aber das habe ich jetzt nicht verstanden. Aber wenn ich mir die Prozedur mal nach so vielen Jahren ansehe, dann geht das hier nur um Groß- bzw- Kleinschreibung, wie gesagt, wenn ich das auskommentiere, wird das Programm kompiliert. Könntest Du mir vielleicht nur noch kurz erklären, wie ich die Zeile

AktZeiger^.Satz.Typ[1]:= Chr(Ord(AktZeiger^.Satz.Typ[1])+16);

umformulieren müßte?


Hier man die ganze Prozedur:



Begin
If AktZeiger <> Nil Then
Begin
If Ord (AktZeiger^.Satz.Typ[1]) < 58 Then
Begin
AktZeiger^.Satz.Typ[1]:= Chr(Ord(AktZeiger^.Satz.Typ[1])+16);
StringGrid1.Cells[0,StringGrid1.Row]:= C_Kontrolliert;
End Else
Begin
AktZeiger^.Satz.Typ[1]:= Chr(Ord(AktZeiger^.Satz.Typ[1])-16);
StringGrid1.Cells[0,StringGrid1.Row]:= '';
End;
GlobalChanged:= True;
Form1.StatusBar1.Panels[0].Text:= 'Daten geändert';
DispAktZeiger;
FillStringGrid(Sender); (* Damit Markierung angezeigt wird *)
End;
End;

jaenicke 11. Jan 2024 11:07

AW: Altes Programm kompilieren
 
Das habe ich doch geschrieben, AnsiChar statt Chr:
Delphi-Quellcode:
AktZeiger^.Satz.Typ[1]:= AnsiChar(Ord(AktZeiger^.Satz.Typ[1])+16);
// oder
AktZeiger^.Satz.Typ[1]:= AnsiChar(Chr(Ord(AktZeiger^.Satz.Typ[1])+16));

Runningdog 11. Jan 2024 11:13

AW: Altes Programm kompilieren
 
Hat geklappt, danke!

AktZeiger^.Satz.Typ[1]:= ansiChar(Ord(AktZeiger^.Satz.Typ[1])+16);

Google hatte gar nicht ausgeworfen, daß es diese Funktion gibt...
War kurz auf dem Schlauch gestanden.

jaenicke 11. Jan 2024 12:44

AW: Altes Programm kompilieren
 
Das ist auch keine Funktion. Das ist ein Typecast, sprich eine Umwandlung in den angegebenen Typ.

himitsu 11. Jan 2024 13:16

AW: Altes Programm kompilieren
 
Wobei man aufpassen muß.

Beim Cast eines Chars wird einfach 1:1 der ordinale Wert übernommen,
während beim Strings anhand der aktuellen Codepage konvertiert wird.

Gut, hier bei einfachem Alphanumerem 0-9 und A-Z stört es nicht.
Und da hier intern eh nur das Zeichen direkt ausgewertet wird, ist hier ein Cast nach Char/WideChar bissl nutzlos und es wäre besser einfacher das direkt durchgängig als AnsiChar zu behandeln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz