Witam! Problem na dzisiejszy wieczór przedstawia się następująco: Mam dwa osobne programy, w jednym jest ListBox w drugim Edit. jak zrobić żeby po kliknięciu w ListBox-a tekst z niego pokazał się w Edit? Jeden program to zwykły exe, drugi wywołuje formatkę z editem z Dll-a. Czy ktoś wie jak to zrobić? Zabawa uchwytami jakoś mi nie wychodzi...
Możesz chociażby zarejestrować komunikat. Jeden wysyła, drugi odbiera. Można też spróbować skorzystać z pamięci współdzielonej i dll-ka jako semafora. Jakbyś się uparł to nawet z pliku na dysku :) Wszystko zależy jak wiele informacji potrzebujesz przekazać. Jeżeli tylko tekst z jednego do drugiego to chyba komunikat będzie najprostszym rozwiązaniem.
Z plikiem próbowałem. Niby ok, ale jakoś nie elegancko tak... Pomysł z komunikatami jest dobry. Tylko w CB nigdy nic takiego nie robiłem i zbyt nie wiem z czym to ugryźć...
Nadawca:
<font size="9">
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MessageCpp.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfMessageTest *fMessageTest;
HWND uchwyty[100];
int indexUchw=0;
HWND hWnd;
char text[20];
//---------------------------------------------------------------------------
__fastcall TfMessageTest::TfMessageTest(TComponent* Owner)
: TForm(Owner)
{bListaClick(NULL);}
//---------------------------------------------------------------------------
bool __stdcall CallBackFunc(HWND hwnd, LPARAM lParam)
{char nazwa[200];
if (IsWindowVisible(hwnd))
{GetWindowText(hwnd, nazwa, 199);
if (StrLen(nazwa) != 0)
{if (!strcmp(nazwa, "Odbiorca"))
strcat(nazwa, " <- to okno odbiera komunikat !!");
fMessageTest->Spis->Items->Add(nazwa);
uchwyty[indexUchw++] = hwnd;
}
}
return true;
}
//---------------------------------------------------------------------------
void __fastcall TfMessageTest::bListaClick(TObject *Sender)
{Spis->Clear();
indexUchw = 0;
EnumWindows((WNDENUMPROC)CallBackFunc,1);
Spis->ItemIndex = 0;
hWnd = uchwyty[0];
lNumer->Caption = "0x" + IntToHex((int)hWnd, 4);
}
//---------------------------------------------------------------------------
void __fastcall TfMessageTest::SpisChange(TObject *Sender)
{hWnd = uchwyty[Spis->ItemIndex];
lNumer->Caption = "0x" + IntToHex((int)hWnd, 4);
}
//---------------------------------------------------------------------------
void __fastcall TfMessageTest::bSendMsgClick(TObject *Sender)
{strcpy(text, eTresc->Text.c_str()); //wysyłny text
COPYDATASTRUCT CopyData = {0, strlen(text) + sizeof(char), text};
SendMessage( hWnd, WM_COPYDATA, long(Handle), long(&CopyData));
}
//---------------------------------------------------------------------------
</span>
Odbiorca:
<font size="9">
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ReceiveMessageCpp.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfMessageRecive *fMessageRecive;
char *text;
//---------------------------------------------------------------------------
__fastcall TfMessageRecive::TfMessageRecive(TComponent* Owner)
: TForm(Owner)
{}
//---------------------------------------------------------------------------
void __fastcall TfMessageRecive::ObslugaKomunikatu(TMessage &Msg)
{DWORD CountData, FPassedData;
PCOPYDATASTRUCT PassedCopyDataStruct;
PassedCopyDataStruct = reinterpret_cast<COPYDATASTRUCT*>(Msg.LParam);
CountData = PassedCopyDataStruct->cbData;
if (CountData > 0)
{text = new char[CountData];
if (PassedCopyDataStruct->lpData != NULL)
memmove(text, PassedCopyDataStruct->lpData, CountData);
}
Win32Check(ReplyMessage(true));
Memo->Lines->Add(text);
delete[] text;
}
//---------------------------------------------------------------------------
</span>
Odpal Odbiorcę, potem Nadawcę - na liście nadawcy wybierz "Odbiorca <- to okno odbiera komunikat !" i naciśnij guzik z podpiętą funkcją "bSendMsgClick". :)
Caption Odbiorcy musi być równy "Odbiorca".
To oczywiście tylko przykład - ale dokładnie opisujący Twój problem.
Dzięki [hurra]