Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.09.2012, 09:56
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию Передача и приём сообщения форме

Есть одна форма в 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  
Старый 07.09.2012, 10:07
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию Уточни

Какое присвоение какого значения в какое поле на какой форме форме ?

Приведи код который работает правильно и который не работает.

А метод Close только присваивает полю ModalResult некоторое значение, которое проверяется после выхода из метода обработки события, в Вашем случае AddButtonClick.
Ответить с цитированием
  #3  
Старый 07.09.2012, 10:16
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

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  
Старый 07.09.2012, 11:40
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Цитата:
И почему-то подчинённая форма, отправляющая сообщение не закрывается перед отправкой сообщения, хотя в коде написано закрыть её перед отправкой:

вот ответ на этот вопрос

Код:
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;

Цитата:
BranchNameEdit.Text:=txtmsg - работает
А здесь уже BranchNameEdit.Text:=txtmsg - не работает...

не понятно что за функция
Код:
StrBreakApart(txtmsg, '<BR>', InputPars);
может она что делает с твоей строкой

поставь ShowMessage до и после, проверь
Ответить с цитированием
  #5  
Старый 07.09.2012, 16:30
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

StrBreakApart указывал в первом сообщении темы. showmessage делал... Ииначе бы не создал эту тему. Просто не выполняется после выполнения сторонней процедуры. Думаю, потому, что не закрыта в этот момент модальная форма, а фокус переходит на дата модуль как-то... Пока фокус на модуле, в который сообщение отправлялось - работает, потом фокус переходит на дата модуль, в котором эта процедура хранится, а после уже не работает... собственно showmessage(txtmsg ) работает и перед и после процедуры... а вот доступ к полю пропадает после процедуры...
Ответить с цитированием
  #6  
Старый 07.09.2012, 16:50
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

конкретнее скажу так:
BranchNameEdit.Text:='12345' - работает только до вызова процедуры BreakApart. ПОсле не работает
Ответить с цитированием
  #7  
Старый 07.09.2012, 20:44
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Никто не знает как решить проблемку? Не хочется обходить через дополнительные переменные...
Ответить с цитированием
  #8  
Старый 07.09.2012, 23:46
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

может быть мне caFree перед отправкой SendMessage попробовать...?? Завтра попробовать нужно будет. ПРосто похожая ситуация как-то была. Думаю, пока модально открыта подчинённая форма, вызвавшая её форма сама к своим объектам не имеет доступа... Как-то так...
Ответить с цитированием
  #9  
Старый 09.09.2012, 03:43
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
Плохо

ребята, буду очень признателен, если поможете в этой проблеме, никак не могу её решить (((((((((((
Ответить с цитированием
  #10  
Старый 10.09.2012, 09:01
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Попробуй передавать в процедуру не ссылку PChar а строку String,
Процедура StringBreakAPart у тебя в принципе не должна менять входящую строчку S а значит
Код:
BranchNameEdit.Text:=txtmsg;
можешь и до процедуры вызывать, если же нужно чтоб изменяла то Const на Var и в теле StringBreakAPart отразить изменения и ещё раз работай со строчкой а не с указателем
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter