Autor Beitrag
zero
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 03.08.02 00:35 
Hi mal ne frage

und zwar will/muss ich einen Integer zu einem String bzw PChar convertieren, unter C++ kein problem aber in delphi habe ich damit schwierigkeiten, hoffe ihr könnt mir helfen, also hier mal etwas source:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
 a,c:pchar;
 b:integer;
begin
 a:='hallo';
 b:=integer(@a);
 // so und nun sollte c=b convertiert werden nur wie ?
end;


in cpp währe das ja so

ausblenden Quelltext
1:
2:
 int a=(int)path.c_str();
 char *b=(char*)a;


benötige das da die programme mit Post und GetMessage untereinander komunizieren und das das ja nur zahlen sind (wParam & lParam) kann ich ja kein char verschiken.

vielen dank schonmal im vorraus.

mfg

Daniel.
Black Lightning
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 69



BeitragVerfasst: Sa 03.08.02 01:03 
ausblenden Quelltext
1:
IntToStr(Integer); string					

_________________
--erst programmieren, dann denken, dann debuggen--
zero Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 03.08.02 01:14 
nein nun wirklich nicht, die funktion liefer den wert nur als string zurück aber der soll aus dem integer einen string MACHEN in dem wert steckt ja text drin... hast du nicht so ganz verstanden :wink:
GPF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 85



BeitragVerfasst: Sa 03.08.02 02:02 
Achso - wäre einfacher, wenn Du auch schreiben würdest was Du genau haben möchtest. Wenn ich Dich also richtig verstehe brauchst Du also die Speicheradresse, an dem der String beginnt, damit Du diese dann als Zeiger übergeben kannst.

In Delphi kannst Du dazu ebenfalls den @-Operator verwenden.
Hier eine kurze Beispielprozedur:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Test;
var p:Integer;
    s:string;
begin
  s:='TEST';
  p:=Integer(s);
  caption:=String(p);
end;


Es hängt natürlich davon ab wie Du Deine Routine genau implementierst. Im oben genannten Beispiel wird der String s am Ende der Prozedur Test wieder freigegeben. Hast Du nun den Zeiger der Speicheradresse zu s an ein anderes Programm weitergeleitet, so zeigt dieser an die ehemalige Speicheradresse, die aber nicht mehr gültig ist.
In diesem Fall dürfte das angesprochene PostMessage allerdings nicht funktionieren, da Postmessage die Nachricht an die Messagequeue sendet und ohne auf Antwort die Bearbeitung der aktuellen Routine fortsetzt.
Du mußt also SendMessage benutzen. Hier wartet Windows bis ein Programm entsprechend der Implementierung die Bearbeitung der Nachricht quittiert hat.

_________________
"Wenn Debugging ein Vorgang ist, Fehler aus einem Programm auszubauen, dann ist Programmieren der Vorgang, Fehler einzubauen."
zero Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 03.08.02 02:59 
Okay soweit war ich dann auch schon...

Hmm stimmt der zeiger ist ja nur auf das programm bezogen verfügbar... das hatte ich noch garnicht überdacht :?

das erklärt auch den access violation error im anderem programm... MIST :(

aber mit SendMessage macht er garnichts, da bekommt er nichtmal eine msg !?

der code für die abfrage ist:

im Form OnCreate ist einfach: Application.OnMessage:=GetInfoMessages;

Programm 2:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.GetInfoMessages(var Msg: TMsg; var Handled: Boolean);
begin
 if Msg.message=WM_USER+231 then
 begin
  ShowMessage('Path: '+String(Msg.wParam));
 end;
end;


das programm verschickt die antworten so:

Programm 1:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
void __fastcall TForm1::ApplicationReceiveMessage(tagMSG &Msg, bool &Handled)
{
 switch (Msg.message)
 {
  case WM_USER+200:
  {
   PostMessage((HWND)Msg.wParam,WM_USER+231,(int)path.c_str(),0);
   break;
  }
 }
}


und hier nochmal der request:

Programm 2:
ausblenden Quelltext
1:
 PostMessage(FindWindow(nil,'unwichtig'),WM_USER+200,Form1.Handle,0);					


hoffe das reicht um zu verstehen was ich machen will :wink:

danke :)
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Sa 03.08.02 13:03 
zero hat folgendes geschrieben:
benötige das da die programme mit Post und GetMessage untereinander komunizieren und das das ja nur zahlen sind (wParam & lParam) kann ich ja kein char verschiken.

Wenn es wirklich um einen Char (1 Byte) dann kannst du die Funktion ORD(Char) verwenden.

Wenn du hingegen einen LongInt (32 Bit) verschicken willst, musst du wie in C++ Mit Zeigern Typcasten. Das könnte so aussehen:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
function CharsToInt(Chars : ARRAY OF CHAR) : LongInt;
  VAR
    pInt : ^Longint;
begin
  pInt := @Chars;
  Result := pInt^;
end;


Das ist jetzt ungetested sollte aber so klappen. Du musst beachten, das exakt die ersten 4 Zeichen des übergebenen Array OF Char interpretiert werden. Du musst also vor dem Aufruf bereichsprüfungen durchführen.

Gruß
Klabautermann
zero Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 03.08.02 14:37 
ich mach wohl besser man nen neuen thread, habe so das gefühl das passt hier nichtmehr rein...
zero Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 03.08.02 14:43