Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 4

Автор: Antananarivu
Дата сообщения: 03.10.2008 00:57
RSoFT1978
Frodo_Torbins
Не работает метод, меню не исчезает.
Таймер стандартный.
Вроде форма прорисовывается в основном потоке... может какая синхронизация хитрая нужна именно в вмомент перехода между потоками...
Автор: ShIvADeSt
Дата сообщения: 03.10.2008 01:42
Antananarivu
http://www.delphi32.com/info_facts/faq/faq_278.asp
и тут
http://forum.vingrad.ru/act-ST/f-85/t-41546.html
Автор: Antananarivu
Дата сообщения: 03.10.2008 08:00
Все это у меня есть... видимо какой то специфический глюк. То есть, когда программа уже работает во втором потоке, менюшка прекрасно всплывает. А виснет она только в момент ухода в параллельный поток (при открытом menu) .

Вот процедура обработки мыши и popupmenu.

Код:
procedure TForm1.IconMouse(var Msg:TMessage);
Var p:tpoint;
begin
GetCursorPos(p);
Case Msg.LParam OF
WM_LBUTTONUP,WM_LBUTTONDBLCLK:
Begin
Ic(2,Application.Icon);
ShowWindow(Application.Handle,SW_SHOW);
ShowWindow(Handle,SW_SHOW);
End;
WM_RBUTTONUP:
Begin
SetForegroundWindow(Handle);
PopupMenu1.Popup(p.X,p.Y);
PostMessage(Handle,WM_NULL,0,0);
end;
End;
end;
Автор: anfilat
Дата сообщения: 03.10.2008 08:17
Antananarivu

Цитата:
Скажите, пожалуйста, а где можно почерпнуть такую подробную информацию: при каких размерах переменной и при каких конкрентно действиях нужна синхронизация, а при каких не нужна? Какие операции атомарные, а какие нет?
Откуда это можно узнать?

Рихтер, глава 8 - Синхронизация потоков в пользовательском режиме.
Но твоя ситуация - практически единственная, когда синхронизация не нужна.
delover

Цитата:
А я думал IUnknown придумали люди понимающие что-то в "надёжной" технике.

Там счетчик, изменяемый из нескольких потоков - совсем другая ситуация.
Автор: ShIvADeSt
Дата сообщения: 03.10.2008 08:24
Antananarivu

Цитата:
PopupMenu1.Popup(p.X,p.Y);

не помню почему, но я отказался от попап впользу TrackPopupMenu. Тоже какие то траблы были, надо дома посмотреть проги, в которых юзаю трей - там вроде я как то по другому меню грохаю.
Автор: delover
Дата сообщения: 03.10.2008 12:06
anfilat
А я бы и через десять годков такую тему не стал подымать. Зачем Вам это если не секрет? Таблов мало чтоли... ?)
Автор: ShIvADeSt
Дата сообщения: 03.10.2008 13:34
Antananarivu
Вот рабочий код, который я как раз использовал, чтобы меню нормально исчезало

Код:

procedure SwitchToWindow(Wnd: HWnd; Restore: Boolean);
begin
if IsWindowEnabled(Wnd) then begin
{$IFDEF WIN32}
SetForegroundWindow(Wnd);
if Restore and IsWindowVisible(Wnd) then begin
if not IsZoomed(Wnd) then
SendMessage(Wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
SetFocus(Wnd);
end;
{$ELSE}
SwitchToThisWindow(Wnd, Restore);
{$ENDIF}
end;
end;

WM_USER + 1:
case lParam of
WM_RBUTTONDOWN:begin
GetCursorPos(Cur);
SwitchToWindow(hWnd,False);
TrackPopupMenu(hSysMenu,TPM_RIGHTALIGN,Cur.x,Cur.y,0,hWndMain,nil);
end;
Автор: anfilat
Дата сообщения: 03.10.2008 13:57
delover

Цитата:
А я бы и через десять годков такую тему не стал подымать. Зачем Вам это если не секрет? Таблов мало чтоли... ?)

Каких траблов? Можешь ты пальцем показать, где тут могут получиться проблемы?
Запись и чтение выравненных 4 байт выполняются одной ассемблерной инструкцией, переключиться на другой поток в середине инструкции процессор не может. Откуда может взяться трабла?
Автор: Antananarivu
Дата сообщения: 03.10.2008 14:41
Ладно ... не получилось у меня избавится от бага... все равно всем спасибо..
Автор: Frodo_Torbins
Дата сообщения: 03.10.2008 16:38
Antananarivu
Попробуйте воспользоватся процедурой LocalAsyncVclCall:

Код: procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=false;
LocalAsyncVclCall(Dm.LoadMsg);
end;
Автор: Antananarivu
Дата сообщения: 03.10.2008 17:16
Нет...
Даже не компилируется вот это: LocalAsyncVclCall(Dm.LoadMsg) - несовпадение типов пишет.
Автор: Frodo_Torbins
Дата сообщения: 03.10.2008 17:30
Хотя нет, так не пойдет.
Попробуйте в таймере просто вызвать EndMenu перед EnterWorkerThread.
Автор: Antananarivu
Дата сообщения: 03.10.2008 17:46
Меню исчезло... но во время отработки Dm.LoadMsg - меню становится недоступно...
Автор: Frodo_Torbins
Дата сообщения: 03.10.2008 18:04
Antananarivu
Ну тогда остается только запихнуть весь код из LoadMsg в полноценный поток.
Автор: Antananarivu
Дата сообщения: 03.10.2008 18:09
Видимо да... спасибо за помощь..попробую..

Добавлено:
Frodo_Torbins
Кстати, убрал вообще потоки. Кинул на форму элемент AntiFreeze из Indy (антизаморозка). теперь вся прога выполняется в одном потоке. Проблема осталось таже самая... может быть это вообще глюк именно popupmenu?..

Добавлено:
И еще одну вещь сделал... убрал вообще потоки, убрал вообще Antifreeze. В процедуре LoadMsg оставил только вот такой код:

Код: Procedure LoadMsg;
var t: integer
begin
repeat
t:=t+1-1;
until 1=2;
end;
Автор: Frodo_Torbins
Дата сообщения: 03.10.2008 18:52
Antananarivu
Это не глюк, а особенность его работы. Проблема в том, что он создает локальную петлю сообщений (подробнее: Сообщения Windows). Все эти AntiFreeze и EnterWorkerThread тоже создают такую петлю. И вот пока ихняя петля работает, петля в popupmenu заблокирована. Это как стопка коробок:
------------------------------------
| петля в EnterWorkerThread |
------------------------------------
------------------------------------
| петля в popupmenu |
------------------------------------
------------------------------------
| петля в Application.Run |
------------------------------------
Пока верхнюю коробку не снимите вторую не сможете передвинуть. Пока не снимите первые две - не сможете передвинуть третью. А для работы TThread никаких петель не нужно.
Автор: Antananarivu
Дата сообщения: 03.10.2008 19:15
Frodo_Torbins
Так в том то и дело, я убрал из проги и Антифриз и EnterWorkerThread - а проблема осталась.

Автор: DmitryKz
Дата сообщения: 03.10.2008 19:16
Ребята, как можно сохранить в файл три массива разнотипных записей?
Автор: Frodo_Torbins
Дата сообщения: 03.10.2008 19:25
Antananarivu
А что осталось? Догадываюсь, что осталось обычное зависание из-за долгого выполнения одной из процедур.
Автор: Antananarivu
Дата сообщения: 03.10.2008 19:28
Frodo_Torbins

Ну да, я там оставил очень длинный цикл.
Я бы согласился, что это просто зависание, но! Ведь если мы уже находимся в этой процедуре этом цикле и я щелкаю на трей менюшка вылезает!
Автор: Frodo_Torbins
Дата сообщения: 03.10.2008 19:35
Antananarivu
Вы в этом уверены? Что то в вашем коде еще не так.
Автор: Antananarivu
Дата сообщения: 03.10.2008 19:41
Уверен... ладно, не буду больше забивать Вам голову.. постараюсь сам разобраться.
Автор: ShIvADeSt
Дата сообщения: 04.10.2008 02:44
DmitryKz

Цитата:
Ребята, как можно сохранить в файл три массива разнотипных записей?

Тип файла роль играет, если нет, то сохраняй в xml - каждая ветка свой тип записей. Аттрибут ветки - количество элементов, тип ветки - тип массива. Если xml не подходит - то надо определиться, как будешь считывать данные. Походу нужна будет работа с нетипизированными файлами.

Добавлено:
Frodo_Torbins

Цитата:
А что осталось? Догадываюсь, что осталось обычное зависание из-за долгого выполнения одной из процедур.

Угу скорее всего приложение не посылает очередное сообщение, пока не отработает процедура. Надо делать нормальные потоки и туда код сувать, я так в свое время делал, когда мне при старте программы надо было просканировать пару папок на наличие в них файлов и еще кое что сделать. Пока код в поток не сунул - было подвисание программы, что не есть хорошо.
Автор: Alex70
Дата сообщения: 04.10.2008 19:24
Доброго времени суток.
Надо прочитать ячейки c Excelя и объединить их в одну строчку

Код: [/code]
var
i:integer;
s[]:array of string;
begin
Excel:=CreateOleObject('Excel.Application');
Excel.Workbooks.Open('C:\st.xls');
Excel.Visible:=True;
for i:=1 to 5 do
begin
s[i]:=Excel.Cells[1,i];
end;
end;
[code]
Автор: DmitryKz
Дата сообщения: 05.10.2008 18:37
Ребята, у меня тут такая трабла со справочной системой Дельфи 7. Список контента продублировался аж трижды. После чего это случилось, не знаю - обнаружил случайно. Причем в редакторе справки (OpenHelp) все в норме. Удалял GID-файлы, нажимал в OpenHelp Clean Registry - ничего не меняется. Что-то еще можно сделать?
Автор: ByteMaster
Дата сообщения: 05.10.2008 20:28

Цитата:
Ребята, у меня тут такая трабла со справочной системой Дельфи 7. Список контента продублировался аж трижды. После чего это случилось, не знаю - обнаружил случайно. Причем в редакторе справки (OpenHelp) все в норме. Удалял GID-файлы, нажимал в OpenHelp Clean Registry - ничего не меняется. Что-то еще можно сделать?


стоит попробовать пункт help->customize и во вкладках посмотреть и удалить дубликаты
"Delphi Object and Component Library Reference" и "Visual Component Library Reference"
Автор: DmitryKz
Дата сообщения: 05.10.2008 20:45
ByteMaster
Написал ведь, что в OpenHelp все в порядке, то есть именно во вкладках нет никаких дубляжей
Автор: Maks150988
Дата сообщения: 05.10.2008 21:54
Ребята, помогите пожалуйста с функцией извлечения имени фтп хост из урл. Ну то есть имеем строку "ftp.bla.ru/files/file.zip" и извлекаем "ftp.bla.ru" из этого месива.
Нашел функцию URLExtractFileName. А есть ли для хоста что-нибудь? Понимаю конечно что нужно искать в строке первый попавшийся разделитель и копировать все до него в результат. Но изобретать велосипед не хочется, а времени мало. Может просто уже есть? Поделитесь функцией пожалуйста. =)
Автор: ShIvADeSt
Дата сообщения: 06.10.2008 04:38
Maks150988
FTPHost:=Copy(MyUrl,1,Pos('/',MyURL)-1);
можно оформить это в функцию. При условии конечно, что протокол не указан в урке, если указан протокол (ftp://ftp.bla.ru) то добавляем логику
if Pos('//',MyURL)>0 then Delete(MyURL,1,Pos('//',MyURL)+1);
FTPHost:=Copy(MyUrl,1,Pos('/',MyURL)-1);
примерно так.
Автор: Aladdinych
Дата сообщения: 06.10.2008 12:44
Извините, если вопрос элементарный, но как сделать так чтобы:
1. Программа на Delphi проверяла, запущенно заданное приложение, если нет то запускала.
2. Активизировала окно этого приложения.
3. Имитировала выбор из меню или подменю этого приложения.
4. В открывшейся форме приложения заполняла поля и имитировала нажатие кнопок этой формы.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.