AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mit PChar arbeiten

Ein Thema von Pseudemys Nelsoni · begonnen am 23. Jun 2004 · letzter Beitrag vom 23. Jun 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Mit PChar arbeiten

  Alt 23. Jun 2004, 07:11
hi,

da bin ich wieder 8).

Also ich habe mal eine frage zum thema PChar...

Da ich immer nur mit strings gearbeitet habe (vcl), frag ich mich wie ich mit PChars umzugehen habe, das fällt mir nämlich ziemlich schwer...
Z.B hatte ich eben gerade wieder so ein Problem das ich einen PChar erweitern wollte:

wDir := wDir + 'System32\'; aber das geht natürlich nicht weil "'System32\'" ja ein string ist...

geht das auch ohne hin und her konvertiereri mit string() und PChar() ?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 07:48
Äh, stört´s dich wenn ich antworte?
Keine Sorge, das steht zwar sicher auch in den Tutorials, aber nicht als Extra-Kapitel.

Schau mal im PSDK nach den "lstr*"-Funktionen.
In deinem Fall
Delphi-Quellcode:
lstrcpy(wDir,'c:\windows'); // <-- kopiert "c:\windows" in "wDir"
lstrcat(wDir,'\System32'); // <-- hängt "\System32" an "wDir" an
Wie gesagt, PSDK: lstrcpy, lstrcmp, lstrcat, lstrlen, usw. Meist gibt´s auch Versionen für Widechars, erkennbar am W, bspw. "lstrcpyW" usw.
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 08:19
Zitat von Pseudemys Nelsoni:
wDir := wDir + 'System32\'; aber das geht natürlich nicht weil "'System32\'" ja ein string ist...

Ich weis, Mathias hat die antwort jetzt schon gepostet, aber liegt des "Problem" nicht eher an dem + ?

Wenn wDir vom Typ PChar ist, und man zum Beispiel:
wDir := 'System32\' schreiben würde, ging das doch auch, weil Delphi 'System32\' dann als PChar-Konstante speichert,oder irre ich mich jetzt da
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 08:53
Zitat von MrKnogge:
Ich weis, Mathias hat die antwort jetzt schon gepostet, aber liegt des "Problem" nicht eher an dem + ?
Ja, durch das Plus meckert der Compiler rum, dass die Typen nicht passen. In einigen Fällen genügt es, wenn man beides noch mal als "pchar" castet:
wDir := pchar(wDir + 'System32\');
Zitat:
wDir := 'System32\' schreiben würde, ging das doch auch, weil Delphi 'System32\' dann als PChar-Konstante speichert,oder irre ich mich jetzt da
Nein, du hast natürlich recht. Die einfache Zuweisung, wie in deinem Beispiel gezeigt, ist bei Delphi nicht das Problem. Nur wenn die pchar-Variable bereits etwas enthält, und du möchtest noch einen Text anhängen, dann brauchst du entweder die o.g. Funktion, oder du versuchst dein Glück mit dem o.g. Casten. In dem Fall geht es ja darum, dass der schon vorhandene Inhalt von "wDir" nicht entfernt wird. Und das würde er, wenn du einfach nur
wDir := 'System32\'; schreibst.


btw: Über den Sinn, an "wDir" (die Vermutung liegt nahe, dass die Variable den Namen des Windows-Verzeichnisses enthält) noch das Systemverzeichnis anzuhängen, will ich mal nicht streiten. Vielleicht ist das reale Beispiel ein anderes, ansonsten wäre wohl "GetSystemDirectory" eine Idee.
Aber man kann ja auch programm-intern weiter mit Strings arbeiten. Ich habe für ein Programm bspw. mal den Ordner "%windir%\help" benötigt, und dafür habe ich mir eine Funktion geschrieben, die mir den Ordner wie gewohnt als String zurückliefert:
Delphi-Quellcode:
function GetWinHelpDir: string;
begin
  SetLength(Result,GetWindowsDirectory(nil,0) + 1);
  SetLength(Result,GetWindowsDirectory(@Result[1],length(Result)));

  if(Result <> '') then
    Result := Result + '\help\';
end;
Und damit ließ sich a) gut arbeiten, und b) das Casten nach pchar war im Bedarfsfall auch kein Problem.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 09:18
Moin!

Zitat von MathiasSimmack:
In einigen Fällen genügt es, wenn man beides noch mal als "pchar" castet:
wDir := pchar(wDir + 'System32\');
Ich würde aber denn vorschlagen das so zu casten:

wDir := wDir + PChar('System32\'); Was aber genauso wenig laufen würde, da er IMHO hier nur die Adressen zusammen rechnet. Problem bei PChar ist, das es Zeicher auf ein Array von Char ist und Delphi bei Zeigern keine grossen Automatismen mitbringt - er rechnet dann eher mit den Zeigern. Daher nutze die oben beschriebenen lstrcat(), etc Funktionen oder die PChar Funktionen aus der SysUtils (StrCat)...

MfG
Muetze1
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 11:23
Ein bisschen aus dem Zusammenhang gerissen, sorry, aber -

Zitat von Muetze1:
Was aber genauso wenig laufen würde [...]
Deswegen schrieb ich ja, dass es in einigen Fällen ausreicht nach pchar zu casten. Dabei fallen mir erst mal hauptsächlich Membervariablen von irgendwelchen Records ein, die als pchar deklariert sind. Bspw. der Filter bei "GetOpenFileName/GetSaveFileName". Oder auch die Beschreibung (lpszTitle) bei "SHBrowseForFolder". In solchen Fällen kannst du Strings und PChars nochmal nach pchar casten, was IMHO keine Probleme verursacht.

Blödes Beispiel mit dem Record für "SHBrowseForFolder", aber es geht:
Delphi-Quellcode:
GetMem(bla,MAX_PATH); // var bla : pchar;
try
  ZeroMemory(bla,sizeof(bla));
  lstrcpy(bla,'Hallo, Du! ');


  // "BrowseInfo" mit Werten füllen
  ZeroMemory(@BrowseInfo,sizeof(BrowseInfo));
  { ... }
  BrowseInfo.lpszTitle := pchar(bla + 'Wähle einen Ordner!');

  // usw.
  { ...}

finally
  FreeMem(bla);
end;
Dagegen würde dein Vorschlag von oben
    BrowseInfo.lpszTitle := bla + pchar('Wähle einen Ordner'); nicht funktionieren sondern die Compilermeldung
Zitat:
[Fehler] fldbrows.pas(260): Operator ist auf diesen Operandentyp nicht anwendbar
verursachen.

Wenn du allerdings kein pchar benutzt sondern selbst ein Zeichenarray deklarierst und als Ziel benutzt, dann funktioniert beides nicht:
Delphi-Quellcode:
var
  bla : array[0..MAX_PATH]of char;
begin
  bla := 'Hallo Du! ';

  // [Fehler] Unit1.pas(31): Inkompatible Typen: 'Array' und 'PChar'
  bla := pchar(bla + 'Wähle einen Ordner');

  // [Fehler] Unit1.pas(32): Operator ist auf diesen Operandentyp nicht anwendbar
  bla := bla + pchar('Wähle einen Ordner');
end;
In dem Fall brauchst du API- oder SysUtils-Funktionen.

Es ist also eine Typfrage.
Aber ich nehme an, dass du das auch sagen wolltest?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 12:07
Moin!

Genau das wollte ich sagen - und ich sagte auch extra, das es so genauso wenig laufen würde. Das mit der Compilermeldung war mir auch ohne Compiler klar. Somit meinen wir beide das gleiche und mein vorheriger Post war in dem Sinne unnötig - sorry.

MfG
Muetze1
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 13:05
Kein Problem. Lieber einmal mehr und zu ausführlich was schreiben, als einmal zu wenig ...
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#9

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 14:19
oha wurde hier viel geschrieben


Zitat:
Äh, stört´s dich wenn ich antworte?
keinesfalls, bin über jede antwort dankbar

Zitat:
Schau mal im PSDK nach den "lstr*"-Funktionen.
Werd ich tun, ich glaub 1mal hatte ich die damals auch schon benutzt. Was ich jedoch bei den Funktionen vermisste ist "lstrpos". Irgendwie gibt es keine Pos funktion, das mich wieder zwingt strings zu bennutzen. :\

Zitat:
schreiben würde, ging das doch auch, weil Delphi 'System32\' dann als PChar-Konstante speichert,oder irre ich mich jetzt da
Jo, Zuweisungen klappen problemlos, da Delphi (soweit ich mir das Vorstelle) den String automatisch in einen PChar mit anschliessendem #0 umwandelt. Das Problem war eher das zusammenfügen:

Zitat:
wDir + 'System32\';
von einem PChar/string.

Zitat:
btw: Über den Sinn, an "wDir" (die Vermutung liegt nahe, dass die Variable den Namen des Windows-Verzeichnisses enthält)
korrekt

Zitat:
ansonsten wäre wohl "GetSystemDirectory" eine Idee
Also die Funktion hatte ich in der Wapi-help auch gefunden, jedoch habe ich nur rausgeleseb das diese den systemordner zurückgibt. Ist sie auch für den System32-ordner?

Zitat:
Ich würde aber denn vorschlagen das so zu casten: : wDir := wDir + PChar('System32\');
Wird das #0 zeichen das wDir ja schon bereits enthält automatisch entfernt und ans Ende gesetzt?



Alles in allem - DANKE für die antworten/tips
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 14:45
Zitat von Pseudemys Nelsoni:
Also die Funktion hatte ich in der Wapi-help auch gefunden, jedoch habe ich nur rausgeleseb das diese den systemordner zurückgibt. Ist sie auch für den System32-ordner?
Je nach OS liefert sie den korrekten Systemordner zurück. Unter 9x also "System", unter NT/2000/XP "System32". Mit anderen Worten: Ja!

Zitat:
Zitat:
Ich würde aber denn vorschlagen das so zu casten: : wDir := wDir + PChar('System32\');
Wird das #0 zeichen das wDir ja schon bereits enthält automatisch entfernt und ans Ende gesetzt?
Diese Form des Castens (oder Castings?) funktioniert aber nicht, wie auch Muetze1 schon schrieb. Extra aus dem Grund habe ich überhaupt Delphi angeschmissen und hier Beispiele mit den Fehlermeldungen zitiert. Das "Zusammenfügen" von PChar und String funktioniert eigentlich nur (wie oben geschrieben), wenn die Zielvariable selbst vom Typ "pchar" ist. Und dann sollte es nach Möglichkeit nicht die PChar-Variable sein, die du bereits benutzt.

Ein Beispiel hatte ich ja genannt, ansonsten bleib bei "lstrcat" (API-Funktion) oder der passenden SysUtils-Funktion. Das ist der sichere und bessere Weg.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 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