Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2015, 18:59   #1
Anton931
Пользователь
 
Регистрация: 20.02.2015
Сообщений: 35
По умолчанию Проблема с показом формы

Всем здрасте) подскажите что делаю не так.
Пишу код который сканирует, все логические диски, а затем выводит сообщение о найденных файлах пользователю.

Процедура CreateWindow, я подписал, это создания формы и вывод информации о найденных файлах. Но после того как поиск завершен форма, промелькнет на доли секунды и пропадает, то есть даже не выводит всю информацию. Как исправить, чтобы она не пропадала, что делаю не так?

Код:
procedure FindDrive;
var
  DiskList: DWORD;
  Drive: Char;
begin
  DiskList := GetLogicaldrives;
  Drive := 'a';
    while (DiskList > 0) do
      begin
        case GetDriveType(Pchar(Drive + ':\')) of
          3: FindFile(Drive + ':\');
        end;
      Disklist := Disklist shr 1;
      Inc(Drive);
    end;
   CreateWindow;//Процедура создания и отображения формы WINAPI
end;
P.S. А в процессах остается висеть, убирать приходится через taskmgr.
Anton931 вне форума Ответить с цитированием
Старый 10.06.2015, 21:14   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Я бы просто выводил всю информацию на дополнительную форму. Об этих формах написано здесь: http://www.delphi-manual.ru/lesson8.php
Вадим Мошев вне форума Ответить с цитированием
Старый 10.06.2015, 22:08   #3
Anton931
Пользователь
 
Регистрация: 20.02.2015
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Я бы просто выводил всю информацию на дополнительную форму. Об этих формах написано здесь: http://www.delphi-manual.ru/lesson8.php
что то я вас не понял. Зачем выводить на дополнительную, если основная создается динамически.
Anton931 вне форума Ответить с цитированием
Старый 10.06.2015, 22:13   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

самое интересное-то зажал. а-ну показывай кишки функции CreateWindow()!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 10.06.2015, 22:45   #5
Anton931
Пользователь
 
Регистрация: 20.02.2015
Сообщений: 35
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
самое интересное-то зажал. а-ну показывай кишки функции CreateWindow()!
ну почему же сразу зажал, стандартная процедура создания окна winapi

Код:
procedure CreateWindow;
begin
  FillChar(WC, SizeOf(TWndClassEx), 0);
  WC.lpszClassName := 'Window';
  WC.lpfnWndProc := @WndProc;
  WC.hbrBackground := COLOR_MENUTEXT;
  WC.hCursor := LoadCursor(0, IDC_ARROW);
  RegisterClass(WC);
  hWindow := CreateWindowEx(0,
  'Window',
  'File Report',
  WS_VISIBLE or WS_POPUP,
  100,
  100,
  300,
  500,
  0,
  0,
  hInstance,
  nil);
  ShowWindow(hWindow, 5);
  UpDateWindow(hWindow);
end;
Anton931 вне форума Ответить с цитированием
Старый 10.06.2015, 22:55   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
стандартная процедура создания окна winapi
это неправда. у стандартной - куча параметров.
Код:
HWND WINAPI CreateWindow(
  _In_opt_ LPCTSTR   lpClassName,
  _In_opt_ LPCTSTR   lpWindowName,
  _In_     DWORD     dwStyle,
  _In_     int       x,
  _In_     int       y,
  _In_     int       nWidth,
  _In_     int       nHeight,
  _In_opt_ HWND      hWndParent,
  _In_opt_ HMENU     hMenu,
  _In_opt_ HINSTANCE hInstance,
  _In_opt_ LPVOID    lpParam
);
Покажи основную петлю обработки сообщений.
на до ж понять, почему окно пропадает.
под отладчиком-то гонял?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 10.06.2015, 23:50   #7
Anton931
Пользователь
 
Регистрация: 20.02.2015
Сообщений: 35
По умолчанию

проблема найдена, но появилась другая. Я использую поиск файлов в потоке, чтобы программа не зависла. Так вот делаю так:

Код:
var
ThID: DWORD;
...
BeginThread(nil, 0, @FindDrive, nil, 0, ThID);
то есть запуск просто цикла поиска, форма в конце появляется без проблем а в потоке лишь мелькает. Как эту задачу решить? Без потока нельзя, чтобы не было зависания.
Anton931 вне форума Ответить с цитированием
Старый 10.06.2015, 23:53   #8
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

прерывание попробуйте sleep
Цитата:
procedure FindDrive;
var
DiskList: DWORD;
Drive: Char;
begin
try
DiskList := GetLogicaldrives;
Drive := 'a';
while (DiskList > 0) do
begin
case GetDriveType(Pchar(Drive + ':\')) of
3: FindFile(Drive + ':\');
end;
Disklist := Disklist shr 1;
Inc(Drive);
sleep(1); //прерывание попробуйте подберите нужное значение
end;
finally
CreateWindow;//Процедура создания и отображения формы WINAPI
EndThread(0);
end;
end;

Последний раз редактировалось Aliens_wolfs; 11.06.2015 в 00:18.
Aliens_wolfs вне форума Ответить с цитированием
Старый 10.06.2015, 23:59   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

а чем обосновано создание проги на чистом API?
учебная задача а-ля "натыкал-сдал-забыл"?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.06.2015, 00:04   #10
Anton931
Пользователь
 
Регистрация: 20.02.2015
Сообщений: 35
По умолчанию

задача, учебная, основанная на работу с потоками. API это дань уважению, современный VLC сплошной мусор из непонятных добавлений, ненужной информации в приложения.

Код потока, в потоке выполняется код указанный ниже:
Код:
procedure FindDrive;
var
  DiskList: DWORD;
  Drive: Char;
begin
  DiskList := GetLogicaldrives;
  Drive := 'a';
    while (DiskList > 0) do
      begin
        case GetDriveType(Pchar(Drive + ':\')) of
          3: FindFile(Drive + ':\');
        end;
      Disklist := Disklist shr 1;
      Inc(Drive);
    end;
   CreateWindow;//Процедура создания и отображения формы WINAPI
end;
...
BeginThread(nil, 0, @FindDrive, nil, 0, ThID);
Anton931 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с показом видео Serg-Grin Мультимедиа в Delphi 0 22.11.2011 15:20
Формы в Delphi, проблема jihot Общие вопросы Delphi 3 17.08.2010 15:23
ПРоблема с открытием формы. byte916 Microsoft Office Access 1 12.05.2010 13:45
проблема с закрытием формы betirsolt Общие вопросы Delphi 46 03.08.2009 01:00
проблема с показом формы после трея za4ot Общие вопросы Delphi 4 21.08.2008 12:35