Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   array of char UpperCase (https://www.delphipraxis.net/121862-array-char-uppercase.html)

EWeiss 6. Okt 2008 07:04


array of char UpperCase
 
Delphi-Quellcode:
zTmp         : array[0..255] of char;
Möchte das ergebnis als UpperCase ausgeben wie konvertieren ?

Delphi-Quellcode:
zTmp := UpperCase(zTmp);
Array und string

gruss Emil

MrSpock 6. Okt 2008 07:06

Re: array of char UpperCase
 
Hallo EWeis,

zTmp als String definieren.

EWeiss 6. Okt 2008 07:08

Re: array of char UpperCase
 
Zitat:

Zitat von MrSpock
Hallo EWeis,

zTmp als String definieren.

ahh danke da muss man erst drauf kommen. :wall:

Nö geht auch nicht dann hab ich noch mehr Fehler
Dann kommt Meldung!
Zitat:

[Pascal Error] uGDIButton.pas(710): E2250 There is no overloaded version of 'UpperCase' that can be called with these arguments
wenn ich es mit string deviniere

gruss Emil

DeddyH 6. Okt 2008 07:18

Re: array of char UpperCase
 
:?: Zeig mal den Code.

mleyen 6. Okt 2008 07:28

Re: array of char UpperCase
 
Delphi-Quellcode:
var
  i: Integer;
begin
  for i := 0 to high(zTmp) do
  begin
    zTmp[i] := UpperCase(zTmp[i])[1];
  end;
end;
:?: ^^

EWeiss 6. Okt 2008 07:31

Re: array of char UpperCase
 
Zitat:

Zitat von DeddyH
:?: Zeig mal den Code.

Habe es zwar oben schon aber bitte ;)

Delphi-Quellcode:
zTmp         : array[0..255] of char;
Delphi-Quellcode:
function AddResource(sResource : PAnsiChar): Integer;
var
  UseStyle, hMain,
  nIndex , nCount: Integer;
  hImage : Cardinal;

begin

    nCount := 0;

    GetShortPathName(sResource, @zTmp, SIZEOF(zTmp));
    zTmp := UpperCase(zTmp); // <<< will nicht
    hMain := wMainWindow(0);
EDIT:
Jetzt habe ich dadurch wieder ein anderes problem .. grrrr
Delphi-Quellcode:
zTmp := PChar(sResource + RightStr('0000' + LTrim(IntToStr(nCount)), 4));
Zitat:

[Pascal Error] uGDIButton.pas(743): E2010 Incompatible types: 'Array' and 'PAnsiChar'
Das nerve mich ungemein diese konvertierungen immer ;)

gruss Emil

Namenloser 6. Okt 2008 07:44

Re: array of char UpperCase
 
Probier mal das:

Delphi-Quellcode:
var
  zTmp: string;
begin
  SetLength(zTmp, 256);
  SetLength(zTmp, GetShortPathName(sResource, @zTmp[1], length(zTmp)-1));
  zTmp := UpperCase(zTmp);
end;
[edit] length(zTmp)-1[/edit]

alzaimar 6. Okt 2008 07:57

Re: array of char UpperCase
 
Nur mal so:
Delphi-Quellcode:
Function Upcase(c : Char) : Char;
Und ein Array in Großbuchstaben geht so (zugegeben: Besonders pervers)
Delphi-Quellcode:
StrPCopy (PChar(@s),Uppercase(StrPas(PChar(@s))));

EWeiss 6. Okt 2008 07:59

Re: array of char UpperCase
 
Zitat:

Zitat von NamenLozer
Probier mal das:

Delphi-Quellcode:
var
  zTmp: string;
begin
  SetLength(zTmp, 256);
  SetLength(zTmp, GetShortPathName(sResource, @zTmp[1], length(zTmp)-1));
  zTmp := UpperCase(zTmp);
end;
[edit] length(zTmp)-1[/edit]

Das bringt mir nichts denn du hast alles rausgeschmissen was ich in dieser abfrage benötige.

nochmal die ganze Funktion.
Ich erstelle eine NonVCL ListBox

Delphi-Quellcode:
  zTmp         : array[0..255] of char;
  zData        : array[0..16] of char;
Delphi-Quellcode:
function AddResource(sResource : PAnsiChar): Integer;
var
  UseStyle, hMain,
  nIndex , nCount: Integer;
  hImage : Cardinal;
  i: Integer;

begin

    nCount := 0;

    GetShortPathName(sResource, @zTmp, SIZEOF(zTmp));
    for i := 0 to high(zTmp) do
    begin
      zTmp[i] := UpperCase(zTmp[i])[1];
    end;

    hMain := wMainWindow(0);

    UseStyle := WS_CHILD or LBS_HASSTRINGS;
    hLISTFNAME := GetMainItem(ID_LISTFNAME);
    if hLISTFNAME = 0 then
       hLISTFNAME := CreateWindowEx(0, 'LISTBOX', nil,
         UseStyle, 0, 0, 0, 0, hMain, ID_LISTFNAME, GetInstance, nil);

    hLISTIMAGE := GetMainItem(ID_LISTIMAGE);
    if hLISTIMAGE = 0 then
       hLISTIMAGE := CreateWindowEx(0, 'LISTBOX', nil,
         UseStyle, 0, 0, 0, 0, hMain, ID_LISTIMAGE, GetInstance, nil);


    if hLISTFNAME <> 0 then
    begin
       nIndex := SendMessage(hLISTFNAME, LB_FINDSTRING, -1, integer(@zTmp));
       if nIndex > -1 then // gleicher Eintrag gefunden
       begin
          SendMessage(hLISTIMAGE, LB_GETTEXT, nIndex, integer(@zData));
          hImage := StrLen(zData);
          // lese den string ein
          SendMessage(hLISTFNAME, LB_GETTEXT, nIndex, integer(@zTmp));
          // lösche den alten Eintrag bevor er aktualisiert wird
          SendMessage(hLISTFNAME, LB_DELETESTRING, nIndex, 0);
          SendMessage(hLISTIMAGE, LB_DELETESTRING, nIndex, 0);
          sResource := PChar(RightStr(string(zTmp), 5));
//          zTmp := sResource + RightStr('0000' + LTrim(IntToStr(nCount)), 4);
          if SendMessage(hLISTFNAME, LB_ADDSTRING, 0, integer(@zTmp)) < 0 then
            hImage := 0 ;
          if SendMessage(hLISTIMAGE, LB_ADDSTRING, 0, integer(@zData)) < 0 then
            hImage := 0;
       end else
       begin
        // kein eintrag gefunden addieren
          hImage := GDI_CreateImageFromFile((sResource));
          if hImage <> 0 then
          begin
//             zTmp := PChar(zTmp + '0001');
             if SendMessage(hLISTFNAME, LB_ADDSTRING, 0, integer(@zTmp)) < 0 then
                GDI_DisposeImage(hImage);
             if hImage <> 0 then
             begin
//                zData := PChar(IntToStr(hImage));
                if SendMessage(hLISTIMAGE, LB_ADDSTRING, 0, integer(@zTmp)) < 0 then
                hImage := 0;
             end;
          end;
       end;
    end;
    Result := hImage;
end;
Mein problem sind die auskommentierten positionen
welche ich wiedermal nicht richtig kovertieren kann.

Delphi-Quellcode:
zTmp := sResource + RightStr('0000' + LTrim(IntToStr(nCount)), 4);
zTmp := PChar(zTmp + '0001');
zData := PChar(IntToStr(hImage));
gruss Emil

Namenloser 6. Okt 2008 08:07

Re: array of char UpperCase
 
Warum machst du es dir denn so kompliziert mit dem Array? Nimm einfach einen String und alles ist gut...

EWeiss 6. Okt 2008 08:09

Re: array of char UpperCase
 
Zitat:

Zitat von alzaimar
Nur mal so:
Delphi-Quellcode:
Function Upcase(c : Char) : Char;
Und ein Array in Großbuchstaben geht so (zugegeben: Besonders pervers)
Delphi-Quellcode:
StrPCopy (PChar(@s),Uppercase(StrPas(PChar(@s))));

jo das funktioniert klasse auch ohne schleife ..

hab dann aber nocht nicht mein anderes Problem gelößt :cry:
Delphi-Quellcode:
zTmp := sResource + RightStr('0000' + LTrim(IntToStr(nCount)), 4);
zTmp := PChar(zTmp + '0001');
zData := PChar(IntToStr(hImage));
Zitat:

[Pascal Error] uGDIButton.pas(739): E2010 Incompatible types: 'Array' and 'string'
[Pascal Error] uGDIButton.pas(750): E2010 Incompatible types: 'Array' and 'PAnsiChar'
[Pascal Error] uGDIButton.pas(755): E2010 Incompatible types: 'Array' and 'PAnsiChar'
gruss Emil

EWeiss 6. Okt 2008 08:10

Re: array of char UpperCase
 
Zitat:

Zitat von NamenLozer
Warum machst du es dir denn so kompliziert mit dem Array? Nimm einfach einen String und alles ist gut...

Schau dir die Funktion an dann weißt du warum es nicht geht.

gruss Emil

Namenloser 6. Okt 2008 08:15

Re: array of char UpperCase
 
Zitat:

Zitat von EWeiss
Zitat:

Zitat von NamenLozer
Warum machst du es dir denn so kompliziert mit dem Array? Nimm einfach einen String und alles ist gut...

Schau dir die Funktion an dann weißt du warum es nicht geht.

gruss Emil

Ich hab mir die Funktion natürlich durchgelesen, aber ich sehe keine Stelle wo ein Array erforderlich ist. Du kannst statt integer(@Array) problemlos integer(@string[1]) benutzen und dir an anderen Stellen eine Menge aufwand sparen...

EWeiss 6. Okt 2008 08:22

Re: array of char UpperCase
 
Zitat:

Zitat von NamenLozer
Zitat:

Zitat von EWeiss
Zitat:

Zitat von NamenLozer
Warum machst du es dir denn so kompliziert mit dem Array? Nimm einfach einen String und alles ist gut...

Schau dir die Funktion an dann weißt du warum es nicht geht.

gruss Emil

Ich hab mir die Funktion natürlich durchgelesen, aber ich sehe keine Stelle wo ein Array erforderlich ist. Du kannst statt integer(@Array) problemlos integer(@string[1]) benutzen und dir an anderen Stellen eine Menge aufwand sparen...

ohne über Array zu gehen so wie du es beschrieben hast
bekomme ich bei
Delphi-Quellcode:
GetShortPathName(sResource, @zTmp, SIZEOF(zTmp));
nichts raus da ich hier einen Buffer benötige.

gruss Emil

DeddyH 6. Okt 2008 08:24

Re: array of char UpperCase
 
Wenn zTmp ein String ist:
Delphi-Quellcode:
GetShortPathName(sResource, @zTmp[1], Length(zTmp));

Namenloser 6. Okt 2008 08:26

Re: array of char UpperCase
 
Du hast ja auch nicht meinen Code benutzt. Bei mir steht @zTmp[1] (Zeiger auf erstes Zeichen) und Length(zTmp)-1. Und vergiss nicht, die Länge des Strings mit SetLength zuerst auf die richtige Länge zu setzen.

EWeiss 6. Okt 2008 08:26

Re: array of char UpperCase
 
Zitat:

Zitat von DeddyH
Wenn zTmp ein String ist:
Delphi-Quellcode:
GetShortPathName(sResource, @zTmp[1], Length(zTmp));

Nein es wird nichts zurückgeliefert
zTmp ist leer wenn ich einen string dafür verwende

gruss Emil

Namenloser 6. Okt 2008 08:30

Re: array of char UpperCase
 
Delphi-Quellcode:
procedure Test(sResource: pChar);
var
  zTmp: string;
begin
  SetLength(zTmp, 256);
  SetLength(zTmp, GetShortPathName(sResource, @zTmp[1], length(zTmp)-1));
  zTmp := UpperCase(zTmp);
  showmessage(ztmp);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Test('c:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2904.0\Microsoft.DirectX.Direct3DX.xml');
end;
Gibt bei mir folgendes aus:

Code:
---------------------------
Project1
---------------------------
C:\WINDOWS\MICROS~1.NET\DIRECT~1\102904~1.0\MICROS~1.XML
---------------------------
OK  
---------------------------

EWeiss 6. Okt 2008 08:32

Re: array of char UpperCase
 
Zitat:

Zitat von NamenLozer
Delphi-Quellcode:
procedure Test(sResource: pChar);
var
  zTmp: string;
begin
  SetLength(zTmp, 256);
  SetLength(zTmp, GetShortPathName(sResource, @zTmp[1], length(zTmp)-1));
  zTmp := UpperCase(zTmp);
  showmessage(ztmp);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Test('c:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2904.0\Microsoft.DirectX.Direct3DX.xml');
end;
Gibt bei mir folgendes aus:

Code:
---------------------------
Project1
---------------------------
C:\WINDOWS\MICROS~1.NET\DIRECT~1\102904~1.0\MICROS~1.XML
---------------------------
OK  
---------------------------

Sorry tut mir leid :oops:
Habe nicht ganz mitbekommen auf was du hinaus wolltest das funktioniert natürlich dann auch mit string
und nimmt mir viel Arbeit ab so wie du schon sagtest.
Hatte die länge nicht mit berücksichtigt.
Danke schön ;)

gruss Emil

DeddyH 6. Okt 2008 08:43

Re: array of char UpperCase
 
GetShortPathName gibt Dir übrigens die benötigte Länge zurück, wenn der Puffer zu klein ist.
Delphi-Quellcode:
SetLength(zTmp,GetShortPathName(sResource,nil,0));
GetShortPathName(sResource,@zTmp[1],Length(zTmp));

turboPASCAL 6. Okt 2008 08:59

Re: array of char UpperCase
 
Man kann auch das Array in den Mülleimer verschieben und sich ein nettes PChar basteln.

Delphi-Quellcode:
function GetShortPathNameStr(longPath: string): string;
var
  szShortPathName: PChar;
  n: integer;
begin
  Result := '';

  GetMem(szShortPathName, MAX_PATH);
  try
    if GetShortPathName(PChar(longPath), szShortPathName, n) > 0 then
      Result = STRING(szShortPathName);
  finally
    FreeMem(szShortPathName);
  end;
end;

Ich habe feststellen müssen das solche Sachen wie @zTmp[1] bei manchen Compilern
in Zeichenwirrwa auflösen.

EWeiss 6. Okt 2008 09:06

Re: array of char UpperCase
 
Zitat:

Zitat von turboPASCAL
Man kann auch das Array in den Mülleimer verschieben und sich ein nettes PChar basteln.

Delphi-Quellcode:
function GetShortPathNameStr(longPath: string): string;
var
  szShortPathName: PChar;
  n: integer;
begin
  Result := '';

  GetMem(szShortPathName, MAX_PATH);
  try
    if GetShortPathName(PChar(longPath), szShortPathName, n) > 0 then
      Result = STRING(szShortPathName);
  finally
    FreeMem(szShortPathName);
  end;
end;

Ich habe feststellen müssen das solche Sachen wie @zTmp[1] bei manchen Compilern
in Zeichenwirrwa auflösen.

Jo so gehts auch denke aber für Nonvcl nicht nötig oder ?
Die Windows.pas darf man ja mit einbinden oder nicht ?

Vieleicht hast noch was um die Plattformen zu prüfen ?
Dann kann ich die letzt SysUtils auch noch rausschmeißen ;)
Delphi-Quellcode:
    Result := (Win32MajorVersion >= 5) and (Win32Platform = VER_PLATFORM_WIN32_NT); // Win 2000 or up
Das stört jetzt noch

gruss EMil

turboPASCAL 6. Okt 2008 10:02

Re: array of char UpperCase
 
Zitat:

Jo so gehts auch denke aber für Nonvcl nicht nötig oder ?
Wieso, das machts doch für das Handling mit PChar's und Strings einfacher. :gruebel:
Man spart sich die Konvertierungs-Arie.

Klar kann man die Windows.pas, Messages.pas einbinden, warum auch nicht.
Die Sysutils würde ich an deiner Stelle drin lassen oder du musst dir eine Eigene basteln
um auf grundliegende Tolls zuzugreifen wie UpperCase, format, Fileexist, ChangeFileExt etc.
Bei meiner Source vom Fisch ist eine kleine dabei.


Delphi-Quellcode:
function IsWin2kOrUp: Boolean;
var
  ovi: TOSVERSIONINFO;
begin
  Result := FALSE;

  ZeroMemory(@ovi, sizeof(TOSVERSIONINFO));
  ovi.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
  GetVersionEx(ovi);
  if (ovi.dwPlatformId = VER_PLATFORM_WIN32_NT) and (ovi.dwMajorVersion >= 5)
    then result := TRUE;
end;
Sowas ? ;)

EWeiss 6. Okt 2008 10:06

Re: array of char UpperCase
 
Zitat:

Zitat von turboPASCAL
Zitat:

Jo so gehts auch denke aber für Nonvcl nicht nötig oder ?
Wieso, das machts doch für das Handling mit PChar's und Strings einfacher. :gruebel:
Man spart sich die Konvertierungs-Arie.

Klar kann man die Windows.pas, Messages.pas einbinden, warum auch nicht.
Die Sysutils würde ich an deiner Stelle drin lassen oder du musst dir eine Eigene basteln
um auf grundliegende Tolls zuzugreifen wie UpperCase, format, Fileexist, ChangeFileExt etc.
Bei meiner Source vom Fisch ist eine kleine dabei.


Delphi-Quellcode:
function IsWin2kOrUp: Boolean;
var
  ovi: TOSVERSIONINFO;
begin
  Result := FALSE;

  ZeroMemory(@ovi, sizeof(TOSVERSIONINFO));
  ovi.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
  GetVersionEx(ovi);
  if (ovi.dwPlatformId = VER_PLATFORM_WIN32_NT) and (ovi.dwMajorVersion >= 5)
    then result := TRUE;
end;
Sowas ? ;)

Jo hab mir da auch was gebastelt
Denke man sollte schon nonvcl bleiben ansonstem kann ich direkt ne Form addieren ;)
JO sowas werd es mal testen.

gruss Emil


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

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