![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Есть одна форма в bpl пакете, открытая как Showmodal, в ней код передачи сообщения парент-форме, которая её вызывала:
Код:
procedure TFAddBranchCompany.AddButtonClick(Sender: TObject); var txtmsg:string; begin ... Self.Close; SendMessage(ParentHandle, MY_MESSAGE, 0, DWORD(PChar(txtmsg))); end; Парент-форма тоже является пакетом bpl и тоже была открыта как Showmodal из другой формы, в ней код приёма сообщения: Код:
procedure TFBranchAndLocation.MessageReceiver(var msg: TMessage);
var
txtmsg: PChar;
InputPars:TStringList;
begin
txtmsg := PChar(msg.lParam);
msg.Result := 1;
BranchNameEdit.Text:=txtmsg;
InputPars:=TStringList.Create();
StrBreakApart(txtmsg, '<BR>', InputPars);
BranchNameEdit.Text:=txtmsg;
try
BranchNameEdit.Text:=InputPars[0];
BranchCityEdit.Text:=InputPars[1];
except
end;
InputPars.Free();
end;Процедура преобразования строки в StringList расположена в пакете DataModule.bpl Код:
procedure StrBreakApart(const S, Delimeter: string; Parts: TStrings);
var
CurPos: integer;
CurStr: string;
begin
Parts.clear;
Parts.BeginUpdate();
try
CurStr := S;
repeat
CurPos := Pos(Delimeter, CurStr);
if (CurPos > 0) then
begin
Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
CurStr := Copy(CurStr, CurPos + Length(Delimeter),
Length(CurStr) - CurPos - Length(Delimeter) + 1);
end
else
Parts.Add(CurStr);
until CurPos = 0;
finally
Parts.EndUpdate();
end;
end;Смысл в том, что присвоение значения в поле на форме работает только до вызова этой процедуры. Строчка кода 9 BranchNameEdit.Text:=txtmsg выполняется а строчка кода 13 уже не работает и пишет в поле пустоту, подскажитие как решить эту проблему?!!! И почему-то подчинённая форма, отправляющая сообщение не закрывается перед отправкой сообщения, хотя в коде написано закрыть её перед отправкой: Код:
Self.Close; SendMessage(ParentHandle, MY_MESSAGE, 0, DWORD(PChar(txtmsg))); Последний раз редактировалось sorockinalex, 07.09.2012 в 10:01. |
|
#2
|
|||
|
|||
|
Какое присвоение какого значения в какое поле на какой форме форме ?
Приведи код который работает правильно и который не работает. А метод Close только присваивает полю ModalResult некоторое значение, которое проверяется после выхода из метода обработки события, в Вашем случае AddButtonClick. |
|
#3
|
|||
|
|||
|
BranchNameEdit.Text:=txtmsg - работает
Код:
procedure TFBranchAndLocation.MessageReceiver(var msg: TMessage);
var
txtmsg: PChar;
InputPars:TStringList;
begin
txtmsg := PChar(msg.lParam);
msg.Result := 1;
BranchNameEdit.Text:=txtmsg;
InputPars:=TStringList.Create();
StrBreakApart(txtmsg, '<BR>', InputPars);
try
BranchNameEdit.Text:=InputPars[0];
BranchCityEdit.Text:=InputPars[1];
except
end;
InputPars.Free();
end;А здесь уже BranchNameEdit.Text:=txtmsg - не работает... Код:
procedure TFBranchAndLocation.MessageReceiver(var msg: TMessage);
var
txtmsg: PChar;
InputPars:TStringList;
begin
txtmsg := PChar(msg.lParam);
msg.Result := 1;
InputPars:=TStringList.Create();
StrBreakApart(txtmsg, '<BR>', InputPars);
BranchNameEdit.Text:=txtmsg;
try
BranchNameEdit.Text:=InputPars[0];
BranchCityEdit.Text:=InputPars[1];
except
end;
InputPars.Free();
end; |
|
#4
|
||||
|
||||
|
Цитата:
вот ответ на этот вопрос Код:
procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;Цитата:
не понятно что за функция Код:
StrBreakApart(txtmsg, '<BR>', InputPars); поставь ShowMessage до и после, проверь |
|
#5
|
|||
|
|||
|
StrBreakApart указывал в первом сообщении темы. showmessage делал... Ииначе бы не создал эту тему. Просто не выполняется после выполнения сторонней процедуры. Думаю, потому, что не закрыта в этот момент модальная форма, а фокус переходит на дата модуль как-то... Пока фокус на модуле, в который сообщение отправлялось - работает, потом фокус переходит на дата модуль, в котором эта процедура хранится, а после уже не работает... собственно showmessage(txtmsg ) работает и перед и после процедуры... а вот доступ к полю пропадает после процедуры...
|
|
#6
|
|||
|
|||
|
конкретнее скажу так:
BranchNameEdit.Text:='12345' - работает только до вызова процедуры BreakApart. ПОсле не работает |
|
#7
|
|||
|
|||
|
Никто не знает как решить проблемку? Не хочется обходить через дополнительные переменные...
|
|
#8
|
|||
|
|||
|
может быть мне caFree перед отправкой SendMessage попробовать...?? Завтра попробовать нужно будет. ПРосто похожая ситуация как-то была. Думаю, пока модально открыта подчинённая форма, вызвавшая её форма сама к своим объектам не имеет доступа... Как-то так...
|
|
#9
|
|||
|
|||
|
ребята, буду очень признателен, если поможете в этой проблеме, никак не могу её решить (((((((((((
|
|
#10
|
||||
|
||||
|
Попробуй передавать в процедуру не ссылку PChar а строку String,
Процедура StringBreakAPart у тебя в принципе не должна менять входящую строчку S а значит Код:
BranchNameEdit.Text:=txtmsg; |