Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Word to PChar (https://www.delphipraxis.net/107246-word-pchar.html)

lbccaleb 24. Jan 2008 18:43


Word to PChar
 
wie konvertiere ich word zu pchar??

Neutral General 24. Jan 2008 18:45

Re: Word to PChar
 
Hi,

Wie willst du ein Word in ein PChar konvertieren? Du kannst höchstens das Word als Pointer auffassen also irgendwie sowas wie PChar(Pointer(Word)) oder sowas, aber ob das dann was sinnvolles ergibt bezweifle ich...

Gruß
Neutral General

SirThornberry 24. Jan 2008 18:46

Re: Word to PChar
 
oh, die Frage ist wohl eher was du vor hast. Bei einem Word werden 2 Bytes des Speichers als vorzeichenlose zahl angesehen. Ein PChar hingegen ist ein Pointer der auf ein einen Char zeigt.

Neutral General 24. Jan 2008 18:47

Re: Word to PChar
 
Zitat:

Zitat von SirThornberry
oh, die Frage ist wohl eher was du vor hast. Bei einem Word werden 2 Bytes des Speichers als vorzeichenlose zahl angesehen. Ein PChar hingegen ist ein Pointer der auf ein einen Char zeigt.

Wobei mir beim lesen dieses Beitrags eingefallen ist das man das Word nicht mal vernünftig als Pointer interpretieren kann weil ein Pointer 4 Bytes groß ist..Also auch von mir die Frage nochmal: Was hast du vor ? :shock:

lbccaleb 24. Jan 2008 18:51

Re: Word to PChar
 
mhh ich musste nen datum (systemtime) in einen text string verwandeln, ich habs jetzt aber gerade hinnbekommen...
hab auf die funktion format zugegriffen... das läuft erstmal, aber komischer weise nur bei einem von 7 tag angaben, bei den restlichen haut er das 2008 in kauderwelsch, hab noch nicht ganz raus wieso..

DeddyH 24. Jan 2008 18:54

Re: Word to PChar
 
Zeig mal etwas Code.

SirThornberry 24. Jan 2008 18:54

Re: Word to PChar
 
könntest du deinen Quelltext mal posten? Ich habe die Befürchtung die hast eine Funktion welche einen PChar zurück gibt welcher auf eine lokale Variable zeigt.

DeddyH 24. Jan 2008 18:55

Re: Word to PChar
 
[OT] Äätsch, Jens, schneller :P [/OT]

SirThornberry 24. Jan 2008 18:58

Re: Word to PChar
 
[OT]@Deddy: Dafür habe ich die Macht deine Beiträge verschwinden zu lassen und dann merkt niemand das du schneller warst :wink:
[edit] Das ist natürlich nicht ernst gemeint[/edit]
Jetzt aber zurück zum Thema
[/OT]

lbccaleb 24. Jan 2008 19:07

Re: Word to PChar
 
Zitat:

Zitat von DeddyH
Zeig mal etwas Code.

ja hier das hab ich vor, um das mal kurz zu erklären ;-)
1. ich hab eine combobox, in der will ich ein bitmap vom wochentag anzeigen, und alle 6 tage nach dem heutigen tag!!
2. soll hinter jedem bitmap dann der jeweilige tag mit datum und jahr angegeben sein
3. wird das ganze in einer itemlist gespeichert, die ich dann mit einer for schleife durchgehe und den items der combobox zuweise!!

nun ist mein problem, ich wollte sowenig units wie möglich nutzen...

Delphi-Quellcode:
procedure SetItemInfos;
var
  TempSystemTime, NewSystemTime: TSystemTime;
  i, TempInt: integer;
  begin;
    GetLocalTime(TempSystemTime);

    for i := low(ItemInfo) to high(ItemInfo) do
      begin;
        if i = 0 then TempInt := 1 else TempInt := 0;

        GetLocalTime(NewSystemTime);

        TempSystemTime.wDay := NewSystemTime.wDay + i;
        ItemInfo[i].DayImage := TempSystemTime.wDayOfWeek + i - 1;
        ItemInfo[i].DayPos := TempInt;
        ItemInfo[i].DateText := PChar(Format('%.2d:%.2d:%.3d', [TempSystemTime.wDay, TempSystemTime.wMonth, TempSystemTime.wYear]));
      end;
  end;

das hab ich bisher nur leider haut es mit einfach die tage raufaddieren nicht hinn ;-( hatte gehofft er aktualisiert das automatisch, aber das macht er leider nicht... sonnst geht es schon, bis auf einen kleinen fehler halt noch in der datums angabe, die item weist er der combobox zu und packt die ganzen daten rein, nur convertiert er hier nur komischer weise einen eintrag von 7 richtig, bei den anderen hat er fehler mit der 08!!

ps und ich weiß das ich es mit dem tag addieren so noch nciht lassen kann, werde mir nochwas einfallen lassen!!


edit:
achja diese zeile hier:
Delphi-Quellcode:
        if i = 0 then TempInt := 1 else TempInt := 0;
ist dafür gedacht, das der erste tag nen kleinen abstand z uden anderen in der combobox hat..

DeddyH 24. Jan 2008 19:10

Re: Word to PChar
 
Wo wird denn TempSystemTime befüllt? Hab ich was übersehen?

lbccaleb 24. Jan 2008 19:12

Re: Word to PChar
 
die hab ich dort als variablen, denn die werden beim ausführen der procedure neu eingelesen (augenblickliche zeit) und dann von dem zeitpunkt an, soll er mir halt 7 tage in der cbbox anzeigen..

SirThornberry 24. Jan 2008 19:13

Re: Word to PChar
 
@deddy: ich glaub du hast was übersehen. wenn ich mich richtig entsinne erwartet GetLocalTime einen var-parameter.

Die Muhkuh 24. Jan 2008 19:14

Re: Word to PChar
 
Dito,

Zeile 6:

Delphi-Quellcode:
GetLocalTime(TempSystemTime);

lbccaleb 24. Jan 2008 19:15

Re: Word to PChar
 
Liste der Anhänge anzeigen (Anzahl: 1)
hab mal nen screenshot von der cbbox gemacht:

[edit=SirThornberry]Bild in Anhang gepackt - Mfg, SirThornberry[/edit]

DeddyH 24. Jan 2008 19:18

Re: Word to PChar
 
OK, eine Zeile nicht gesehen. Geht es nur darum, den Wochentag von einem Datum + x Tage zu ermitteln? Dann schau Dir nochmal meinen (editierten) Beitrag im anderen Thread an.

SirThornberry 24. Jan 2008 19:19

Re: Word to PChar
 
der fehler liegt wie erwartet hier:
Delphi-Quellcode:
ItemInfo[i].DateText := PChar(Format('%.2d:%.2d:%.3d', [TempSystemTime.wDay, TempSystemTime.wMonth, TempSystemTime.wYear]));
Grund: Das Ergebnis von Format ist außerhalb der Funktion nicht mehr verfügbar. Das ganze würde dem gleich kommen:
Delphi-Quellcode:
var
  abc: String;
begin
  [...]
  ItemInfo[i].DateText = PChar(abc);
Das Ergebnis liegt also auf dem Stack und nach verlassen der Funktion zeigt zwar der Zeiger noch auf diese Stelle aber sobald etwas neues auf den Stack gepackt wird, wird auch der Wert überschrieben der irgendwann mal dort stand.

Noch besseres Beispiel:
Delphi-Quellcode:
procedure GibZahlAlsString(Zahl: Integer): PChar;
var
  meinString: String;
begin
  meinString := IntToStr(Zahl);
  result = @Zahl[1];
end;

lbccaleb 24. Jan 2008 19:22

Re: Word to PChar
 
Zitat:

Zitat von SirThornberry
der fehler liegt wie erwartet hier:
Delphi-Quellcode:
ItemInfo[i].DateText := PChar(Format('%.2d:%.2d:%.3d', [TempSystemTime.wDay, TempSystemTime.wMonth, TempSystemTime.wYear]));
Grund: Das Ergebnis von Format ist außerhalb der Funktion nicht mehr verfügbar. Das ganze würde dem gleich kommen:
Delphi-Quellcode:
var
  abc: String;
begin
  [...]
  ItemInfo[i].DateText = PChar(abc);
Das Ergebnis liegt also auf dem Stack und nach verlassen der Funktion zeigt zwar der Zeiger noch auf diese Stelle aber sobald etwas neues auf den Stack gepackt wird, wird auch der Wert überschrieben der irgendwann mal dort stand.

ok und was kann ich zumindest dagegen schon mal tun??

SirThornberry 24. Jan 2008 19:28

Re: Word to PChar
 
Die Frage kann man am besten beantworten wenn du uns zeigst was ItemInfo ist.
Zur Zeit ist bei dir
Delphi-Quellcode:
ItemInfo[i].DateText
ein Pointer (PChar ist nichts anderes). Wenn du also direkt in DateText Daten halten willst solltest du einen anderen Typ wählen. Anderenfalls musst du Speicher reservieren wo du die Daten dann hinpackst und darauf kannst du dann DateText zeigen lassen.

Remko 24. Jan 2008 19:37

Re: Word to PChar
 
Maybe I don't understand the question right because of my bad German Language knowledge but it seems to me you want to display a systemtime as string? Why not use SystemTimeToDateTime and use format?

lbccaleb 24. Jan 2008 19:39

Re: Word to PChar
 
ja klar hier:

Delphi-Quellcode:
type
  TComboBoxItemInfo = record
    DayImage,
    DayPos : integer;
    DateText : pchar;
  end;

lbccaleb 24. Jan 2008 19:41

Re: Word to PChar
 
Zitat:

Zitat von Remko
Maybe I don't understand the question right because of my bad German Language knowledge but it seems to me you want to display a systemtime as string? Why not use SystemTimeToDateTime and use format?

because i compile without the needed units..

SirThornberry 24. Jan 2008 19:42

Re: Word to PChar
 
Und warum hast du DateText als PChar definiert?
Willst du über dll-grenzen hinweg arbeiten? Wenn dem nicht so ist wäre es das einfachste du definierst DateText als String.

lbccaleb 24. Jan 2008 19:46

Re: Word to PChar
 
hmm stimmt eigentlich mal sehen....

ok danke das geht schon mal, nun muss ich eigentlich nur noch wissen wie ich mit systemtime herrausfinde welcher wochentag ist, denn leider gehtest mit
Delphi-Quellcode:
systemtime.wday + 1;
nicht!! gibs noch ne möglichkeit???

Remko 24. Jan 2008 19:50

Re: Word to PChar
 
I also defined DateTimeString function in JwaWinsta this is an api from utildll that (well the name says it all). It also takes care of localisation for you (it takes a filetime as input).

lbccaleb 24. Jan 2008 20:00

Re: Word to PChar
 
yes, but i must use the units sysutils, math and types to compile the prog. i want without these units to get a small filesize.. i should be all nonvcl..

Remko 24. Jan 2008 20:03

Re: Word to PChar
 
You don't need all that, it's all winapi:

// This is the version for NT Terminal Server, 2000, XP/2003 and Server 2008
function DateTimeString(DateTime: PFILETIME; lpBuffer: PWideChar): PWideChar;
stdcall;

// This is a wrapped for all OS versions
function DateTimeStringSafe(DateTime: PFILETIME; lpBuffer: PWideChar;
cchDest: SIZE_T): PWideChar; stdcall;

// This is the Vista version which takes an additional parameter with
// maximum buffer size (you have to set it)
function DateTimeStringVista(DateTime: PFILETIME; lpBuffer: PWideChar;
cchDest: SIZE_T): PWideChar; stdcall;

function DateTimeString; external utildll name 'DateTimeString';
function DateTimeStringVista; external utildll name 'DateTimeString';

function DateTimeStringSafe(DateTime: PFILETIME; lpBuffer: PWideChar;
cchDest: SIZE_T): PWideChar; stdcall;
begin
// Zero Memory
ZeroMemory(lpBuffer, cchDest * SizeOf(WCHAR));

// Are we running Vista?
if IsVista then
begin
// Vista version
Result := DateTimeStringVista(DateTime, lpBuffer, cchDest);
end
else begin
// Other OS's (including server 2008!)
Result := DateTimeString(DateTime, lpBuffer);
end;
end;

lbccaleb 24. Jan 2008 20:12

Re: Word to PChar
 
Zitat:

Zitat von Remko
I also defined DateTimeString function in JwaWinsta this is an api from utildll that (well the name says it all). It also takes care of localisation for you (it takes a filetime as input).

is jwawinsta a single unit?? wehre can i find this??

Remko 24. Jan 2008 20:14

Re: Word to PChar
 
It's part of the Jedi Apilib.


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