Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Copy und Delete ohne Strings (https://www.delphipraxis.net/92909-copy-und-delete-ohne-strings.html)

Zacherl 28. Mai 2007 19:06


Copy und Delete ohne Strings
 
Hey,

ich habe folgenden kleinen Code:

Delphi-Quellcode:
S1 := Copy(S, 1, 255);
Delete(S, 1, 255);
S2 := Copy(S, 256, 255);
Okey noch schlimmer als gedacht .. natürlich kennt das Programm auch kein Copy und kein Delete .. kann man das irgendwie mit inline Assebler regeln?

Gruß Florian

DGL-luke 28. Mai 2007 19:11

Re: Copy und Delete ohne Strings
 
Öhm... bist du dir sicher, dass das so nicht funktioniert? Solange der Delphi-Compiler, mit dem du den Maschinencode erzeugst, das alles versteht sollte es doch reichen...

Zacherl 28. Mai 2007 19:18

Re: Copy und Delete ohne Strings
 
Ne funktioniert wirklich nicht. Das liegt am Injizieren. Habs allerdings grade hinbekommen. S1 und S2 als ShortString deklarieren und folgendes verwenden:

Delphi-Quellcode:
CopyMemory(@S[1], Mem, 510);
CopyMemory(@S1[1], @S[1], 255);
CopyMemory(@S2[1], @S[256], 255);

SirThornberry 28. Mai 2007 19:25

Re: Copy und Delete ohne Strings
 
du solltest eventuell einen Teil des durchgestrichenen im ersten Beitrag entfernen damit man auch weiß warum copy etc. nicht funktioniert. Ansonsten ist es ein recht arger krampf den durchgestrichenen Text zu lesen. Zumal man denkt das der durchstrichene Text irrelevant ist eben weil er gestrichen wurde.

ErazerZ 28. Mai 2007 20:56

Re: Copy und Delete ohne Strings
 
Sowas?
Delphi-Quellcode:
function MyLength(s: string): Integer;
begin
  asm
    xor ecx, ecx
    cmp dword ptr [s], 0
    je @@exit
    mov eax, [s]
  @@start:
    inc ecx
    cmp byte ptr [eax+ecx], 0
    jne @@start
  @@exit:
    mov [result], ecx
  end;
end;

function MyCopy(s: string; start, len: Integer): string;
var
  x: Integer;
begin
  result := '';
  if (start >= 0) and (len >= 0) then
  begin
    for x := start to (start + len) -1 do
    begin
      result := result + s[x];
    end;
  end;
end;

procedure MyDelete(var s: string; start, len: Integer);
var
  x: Integer;
  tmp: string;
begin
  if (start >= 0) and (len >= 0) then
  begin
    tmp := '';
    if (start > 1) then
    begin
      for x := 1 to start -1 do
      begin
        tmp := tmp + s[x];
      end;
    end;
    x := (start + len);
    repeat
      tmp := tmp + s[x];
      x := x +1;         // kein inc >_>
    until s[x] = #0;     // achtung prüft nur auf #0 zeichen!
    s := tmp;
  end;
end;
Aber du kannst ja immer noch die APIs benutzen, lstrlen etc.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 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