Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Job-Börse: Angebote und Gesuche (https://www.delphipraxis.net/66-job-boerse-angebote-und-gesuche/)
-   -   Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5 (https://www.delphipraxis.net/206605-hallo-suche-hilfe-auf-stundenbasis-ludwigsburg-delphi-xe5.html)

Ceruso 11. Jan 2021 14:41

Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
Hallo suche Hilfe auf Stundenbasis in Ludwigsburg
bestehendes Delphiprojekt
wurde von Delphi 3 auf delphi XE5 portiert und angepasst , seitdem läuft eine bisher eingbundene DLL nicht mehr


StdCall EXTERNAL xxxx.dll

gibt keine Daten mehr zurück

mkinzler 11. Jan 2021 14:44

AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
Vermutlich ein Unicode-Problem

hoika 11. Jan 2021 14:48

AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
Hallo,
mkinzler hat es schon angesprochen.

Wie sieht die Signatur (Parameter-Liste) der DLL-Methoden aus?

alt
procedure Dll_1(Name: String);
procedure Dll_2(Name: PChar);

neu (müsste geändert werden)
procedure Dll_1(Name: AnsiString);
procedure Dll_2(Name: PAnsiChar);

Ceruso 11. Jan 2021 14:58

AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
Hallo

dies wird übergeben
als erstes sollte der Name der Datei übergeben werden.
Die Dll prüft in einem Verzeichniss alle Dateien auf folgende Zeichen " IF POS('0 1 2 3 4 5 6 7 8 9',HStr)=1 THEN "
und falls vorhanden soll der Name übergeben werden.

F
Delphi-Quellcode:
UNCTION ExtFlrFirst   (Name         : STR255;
                         VAR Kopf     : TFlrKopf;
                         VAR ExtFlrDat : TExtFlrDat) : INTEGER;
StdCall EXTERNAL 'Flr_Ein.dll' INDEX 1;

FUNCTION ExtFlrNext    (VAR Kopf     : TFlrKopf;
                         VAR ExtFlrDat : TExtFlrDat) : INTEGER;
StdCall EXTERNAL 'Flr_Ein.dll' INDEX 2;

FUNCTION ExtFlrKopf    (Name     : STR255;
                         Bez      : STR255;
                         VAR Kopf : TFlrKopf) : INTEGER;
StdCall EXTERNAL 'Flr_Ein.dll' INDEX 3;

FUNCTION ExtFlrLesen   (Name     : STR255;
                         Bez      : STR255;
                         VAR Kopf : TFlrKopf;
                         VAR Anz  : INTEGER;
                         VAR C,X  : TEHTSpalte) : INTEGER;
StdCall EXTERNAL 'Flr_Ein.dll' INDEX 4;

FUNCTION ExtFlrLoeschen (Name     : STR255;
                         Bez      : STR255;
                         TmpName  : STR255) : INTEGER;
StdCall EXTERNAL 'Flr_Ein.dll' INDEX 5;
DLL:
Delphi-Quellcode:
FUNCTION StringIstLeer (HStr : STRING) : BOOLEAN;
VAR I : INTEGER;
BEGIN
  I := LENGTH(HStr); WHILE (I>0) AND (HStr[I]=' ') DO DEC(I);
  StringIstLeer := I=0;
END;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
BEGIN
  HoleZeile := FALSE;
  IF Dat.Flag AND (Dat.BPos<Dat.Size) THEN
  BEGIN
    Zeile.Anfg := Dat.BPos;
    Zeile.Txt := '';
    Zeile.Typ := -1;
    CR := FALSE;
    LF := FALSE;
    I := 0;
    REPEAT
      IF Dat.BPos>=Dat.Pos THEN LeseBlock(Dat);
      IF Dat.Flag AND (Dat.BPos<Dat.Size) THEN
      BEGIN
        B := Dat.Blk[Dat.BPos-Dat.BAnf];
        INC(Dat.BPos); INC(I);
        IF B=$0A THEN LF := TRUE ELSE
        IF B=$0D THEN CR := TRUE ELSE
        IF Length(Zeile.Txt)<128 THEN
        BEGIN
           {Zeichen kleiner ' ' in Leerzeichen wandeln,
            fuehrende und mehrfache Leerzeichen gleich aussondern:}
           IF (B>ORD(' ')) THEN Zeile.Txt := Zeile.Txt+CHR(B) ELSE
           IF (LENGTH(Zeile.Txt)>0)
              AND (Zeile.Txt[Length(Zeile.Txt)]<>' ')
           THEN Zeile.Txt := Zeile.Txt+' ';
        END ELSE
        IF I>MaxZL THEN Dat.Flag := FALSE;
      END;
    UNTIL (NOT Dat.Flag) OR CR OR LF OR (Dat.BPos>=Dat.Size);
    {Zeilenabschluss mit CR, folgt noch ein zugehoeriges LF?}
    IF CR AND Dat.Flag AND (Dat.BPos<Dat.Size) THEN
    BEGIN
      IF Dat.BPos>=Dat.Pos THEN LeseBlock(Dat);
      IF Dat.Flag AND (Dat.Blk[Dat.BPos-Dat.BAnf]=$0A) THEN INC(Dat.BPos);
    END;
    {Zeile gelesen?}
    IF Dat.Flag THEN
    BEGIN
      HoleZeile := TRUE;
      {Enthaelt die Zeile Daten?}
      HStr := Zeile.Txt;
      {Leerzeile?}
      IF StringIstLeer(HStr) THEN Zeile.Typ := 0 ELSE
      {Spaltenbeschriftung?}
      IF [B]POS('0 1 2 3 4 5 6 7 8 9',HStr)=1[/B] THEN
      BEGIN
        IF StringIstLeer(COPY(HStr,20,255)) THEN Zeile.Typ := 1;

Klaus01 11. Jan 2021 17:24

AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
wie ist denn z.B. "B" definiert oder der Type: STR255 (Array[0..254] of char?)

Grüße
Klaus

Ceruso 12. Jan 2021 05:44

AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
Delphi-Quellcode:
LIBRARY Flr_Ein;

USES SysUtils,Classes;


TYPE
  TWert           = RECORD
                       Gueltig : BOOLEAN;
                       Wert   : DOUBLE;
                     END;
CONST
  MaxEHT          = 7200;
  MaxEHTSP        = 7200;
TYPE
  [B]STR255 [/B]       = Ansistring;{STRING[255];}
  PEHTSpalte      = ^TEHTSpalte;
  TEHTSpalte      = ARRAY[0..MaxEHTSP] OF DOUBLE;
TYPE
  TFlrKopf        = RECORD
                       Bez      : STR255;   {Bezeichnung}
                       EHT      : STR255;   {Dateiname EHT}
                       Bea      : STR255;   {Bearbeiter}
                       Bem      : STR255;   {Bemerkung}
                       Dat      : STR255;   {Datum/Uhrzeit}
                       DFl      : BOOLEAN;  {Flag Stoessel gelesen}
                       DRS      : TWert;    {Durchmesser Rollenstoessel}
                       Wkl      : TWert;    {Bezugswinkel}
                       Spg      : TWert;    {1=Gespiegelt}
                       Fkt      : TWert;    {Bewertungsfaktor}
                       Inch     : BOOLEAN;  {Flag fuer Masssystem}
                       Norm     : BOOLEAN;  {Flag, Daten normal auf T-Bahn}
                     END;
TYPE
  TExtFlrDat      = ARRAY[0..255+4] OF BYTE;

.
.
.
.FUNCTION HoleZeile (VAR Dat  : TDatei;
                    VAR Zeile : TZeile) : BOOLEAN;
CONST
  MaxZL           = 500;
VAR
 [B] B [/B]              : BYTE;
  CR,LF           : BOOLEAN;
  I,J,E           : INTEGER;
  HStr            : STR255;

hoika 12. Jan 2021 06:42

AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
Hallo ,
wir brauchen die Definition aller Datentypen,
ST255, TFlrxxxxx

Dort muss alles von String auf AnsiString, von Char auf AnsiChar geändert werden.

OlafSt 12. Jan 2021 07:52

AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
Abgesehen vom offensichtlichen problem mit den Shortstrings, die ja zum Unicode-Problem führen sind da noch mehr Fallstricke vergraben, die man im hier geposteten Code sieht. Da wäre vielleicht mal ein Refactoring angesagt - das ist auch kein Hexenwerk und sicher rasch erledigt.

dummzeuch 12. Jan 2021 12:29

AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
Könnte man diese Diskussion vielleicht in eine andere Kategorie verschieben? Ursprünglich ging es ja um ein Job-Angebot.

himitsu 12. Jan 2021 15:01

AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
 
UnicodeProblem:
Ja, erstmal ist "String" (nicht der Typ "String[123]") seit Delphi 2009 ein Alias für einen UnicodeString und vorher war er es für AnsiString.
Aber der Typ "String[123]" ist und war immer ANSI.



Was bedeutet
Delphi-Quellcode:
Ansistring;{STRING[255];}
?

Es was mal String[255] und ist jetzt AnsiString?

String/AnsiString/UnicodeString sind "LongStrings", was "intern" ein Zeiger auf einen String ist,
also im Record oder den Parametern mit diesem Typen ist immer nur ein "Pointer" drin.

Beim Typen String[123] ist es aber ein "ShortString", was "intern" ein Record/StatischesArray ist, also da wo dieser Typ drin ist, dort sind die Chars direkt drin. (und ich wette, es war beim Record TFlrKopf und den Parametern, für die DLL-Schnittstelle, auch absichtlich so)




PS: statt
Delphi-Quellcode:
if StringIstLeer(HStr) then
kann man auch
Delphi-Quellcode:
if Trim(HStr) = '' then
verwenden
und statt
Delphi-Quellcode:
if Pos(...) = 1 then
würde ich heutzutage eher Delphi-Referenz durchsuchenStartsStr empfehlen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.
Seite 1 von 2  1 2   

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