Отправляет email-рассылки с помощью сервиса Sendsay

Delphi - проблемы и решения

  Все выпуски  

Проблемы и решения в Delphi #50


Служба Рассылок Subscribe.Ru

5823 подписчиков.

Проблемы и решения в Delphi - выпуск 50 от 10.03.2002.


О! Сколько девушек...


* В БАЗУ OFFLine * * ВСЕ ВОПРОСЫ * * СПРОСИТЬ * * ПРЕДЛОЖИТЬ * * АРХИВЫ * * СКОЛЬКО НАС *


Доброго Вам времени суток уважаемый читатель.

Поздравляю! Поздравляю! Поздравляю! Дамы - с праздником! Вы действительно лучшее, что есть у нас - мужчин. Всегда помните, что мы ВАС всех и в отдельности очень любим. Естественно, в отдельности каждый любит по своему :-) Еще раз с праздником.




Как обычно в выпуске:

1. Очередные вопросы.
2. Отвеченные вопросы.
3. Наша база OFFLine взаимопомощи.


* В БАЗУ OFFLine * * ВСЕ ВОПРОСЫ * * СПРОСИТЬ * * ПРЕДЛОЖИТЬ * * АРХИВЫ * * СКОЛЬКО НАС *

1. Очередные вопросы.

Вопрос 718:
От: Alfredo

как управлять DiaLUp подключением, вообще
и на стадии подключения в частности (например Отключить если надо,
узнать имя пользователя и т.д. и.т.п. ).
 


Ответить.


Попробуй так:


Вопрос 719:
От: BsLic

Есть DOS программа, которая требует от пользователя ввода
  каких либо данных, после этого выводит что-то на экран. Я хочу
  вводить в эту консоль и выводить из неё в TMemo (например).
  Пишу на Delphi оболочку под эту DOS программу. Перерыл всю хелпу,
  нашел кучу компонентов (DosCommand, MemoConsol, Console и т.д.),
  но всё глючит - то не работает под
  Win9x, то под WinMe, то под  Win2k(а надо чтобы работала везде).
  Знаю как делать : CreateProcess --> CreatePipe --> перехватываем
  стандартный вывод и ввод консоли --> WriteFile or ReadFile.
  Всё, типа до дикости просто, но работать (нормально работать) енто
  не хочет. А очень хотелось бы. Помогите чем могете: исходнички,
  советы, ссылки.


Ответить.


Попробуй так:


Вопрос 720:
От: BsLic

пишу графический редактор(типа AutoCad, но со
специфическими возможностями) и появилась необходимость быстрой
прорисовки. Например, пользователь выбирает несколько объектов (пока
только линии) и перетаскивает их, в процессе перетаскивания они
перерисовываются на экране. Перерисовываю просто - беру кординаты
перетаскиваемых линий и поочередно каждую линию стираю на старом месте
и рисую на новом. Рисование через canvas очень медленно, т.е. когда
перетаскиваемых линий предположим 5, то мерцания не заметно. Когда же
линий уже больше, все это начинает сильно мерцать. Недавно решил на
рисовать линии один раз на внеэкранном растре, а затем просто копировать
со смещение в canvas функцией BitBlt, все вроде работает быстрее,
но появилась новая идея и появилась новая проблемма. Вопрос как мне
быстро рисовать изменяющиеся фигуры(линии).
Например даны 20 точек из каждой в текущую позицию курсора рисуется
линия, т.е. 20 линий и все они рисуются за курсором (а так как старые
линии должны тожа стираться, то приходится рисовать 40 линий) при этом
все мерцает. Как с этим бороться?


Ответить.


Попробуй так:


Вопрос 721:
От: Shamashov

Подскажите как програмно можно выделить
в richedit текст?
Причем надо сделать так,чтобы выделено было
заданное количество символов.


Ответить.


Попробуй так:


Вопрос 722:
От: Dabadabiabo

 
При использовании SQL в каталоге программы
создаются временные файлы БД.
Как программно задать путь для создания этих файлов
в другой папке, например, Windows\Temp\


Ответить.


Попробуй так:


Вопрос 723:
От: Соколов

Как с помощью Delphi произвести копирование папки?


Ответить.


Попробуй так:


Вопрос 724:
От: Alex Zhuravlev

Кто знает, как печатать на матричном принтере на бесконечной бумаге,
когда длина заранее не известна -
как я понимаю, надо что-то типа EndDoc без прокручивания страницы или
что-то умнее?


Ответить.


Попробуй так:


Вопрос 725:
От: Oleg Supronenko

Подскажите где найти компонент ADS для работы с таблицами без BDE для
Delphi 5.


Ответить.


Попробуй так:



* В БАЗУ OFFLine * * ВСЕ ВОПРОСЫ * * СПРОСИТЬ * * ПРЕДЛОЖИТЬ * * АРХИВЫ * * СКОЛЬКО НАС *

2. Отвеченные вопросы.

Вопрос 702:
От: AA

Есть окно родитель - оно запускает через Show дочернее окно.
Как сделать так, чтобы оно тоже отображалось в панели задач?


Ответить.

Попробуй так:
Не помню точно как, но используется процедура CreateParams.
procedure TForm1.CreateParams(var Params:TParams); begin inherited CreateParams(var Params:TParams); {Дальше не помню, извини.} end; Попробуй так:
procedure TForm1.FormShow(Sender: TObject); begin SetWindowLong(Handle,GWL_EXSTYLE,WS_EX_APPWINDOW); end; Попробуй так:
Делается это следующим образом: В дочерней форме в public секции пишем: procedure CreateParams(var Params:TCreateParams);override; затем описываем эту процедуру: procedure TForm2.CreateParams; begin inherited; Params.WndParent:=HWND_TOP; end; Вот типа и все!!! Попробуй так:


Вопрос 703:
От: AAKolesnichenko@TONIPI.surgutneftegas.ru

Подскажите как реализовать перетаскивание URL-а (страницы, рисунка,
архива) из браузера (Internet Explorer) на компанент Delphi (Memo)


Ответить.

Попробуй так:


Вопрос 704:
От: Vladimir

1) Как получить список запущенных программ?
2) Можно ли как-нибудь узнать, как закрывается программа - принудительно
(по Ctrl-Alt-Del) или при выгрузке Винды?


Ответить.

Попробуй так:
procedure FindAllWindow; var Wnd : hWnd;
buff: array [0..254] of Char; begin Form1.ListBox1.items.clear; Wnd := GetWindow(application.Handle, gw_HWndFirst); while Wnd <> 0 do begin GetWindowText(Wnd, buff, sizeof(buff)); if buff<>'' then form1.listbox1.items.add(buff); Wnd := GetWindow(Wnd, gw_hWndNext); end; end; Тута типа в ListBox1 (который на form1) вносятся названия всех окон которые запущены у тя на компе. Тут так жк показываются и не видимые окна (кроме тех у которых название окон = пустой строке). Мона в томже цикле проверять, видимо окно или нет, или оно дочернее и.т.д. Я не помню щас как это делать. По воторому вопрсоу помню, что винда типа если хотит убить какоето приложение, запрос ему посылает. "Типа я тебя щас буду убивать, дорогая прога. Давайка доканчивай свои дела и жду от тебя ответа когда готова будешь умереть". Чота в таком роде. Когда прога ответа не дает, тогда винда начинает тупить и тормозить. Попробуй так:


Вопрос 705:
От: Б. Б.

:1.Как в F1Book (Formula one Active X)  программно записать какое-то
значение в определенную ячейку?
:2. Где взять Help по Formula one (лучше,-русский)?
:3 Где взять Formula one,работающий с Excel97 или Excel 2000?


Ответить.

Попробуй так:


Вопрос 706:
От: Alexey Shubin

Где взять компоненту запаковки,
только без VCL. Надо что бы код был компактным.
Или на худой конец алгоритм запаковки
ZIP или какой другой  ????
PS. D5


Ответить.

Попробуй так:
ZLib есть е постаке Delphi в \Extras. Возможно это то что теб
е нужно. Попробуй так:
'Есть у меня кое-чего про LZW-компрессию, с проектом и demo (всего 10k). Не проверял...Если надо кинь мне на warcky@chat.ru адрес, вышлю...


Вопрос 707:
От: Alexander Prishchepa

Как имея Handle библиотеки (полученный при помощи LoadLibrary) узнать
каталог, из которого она загружена, т.е. из каталога Винды, Системного,
каталога проги или вообще из чего-нибудь прописанного в Path-e.


Ответить.

Попробуй так:
Вот так : function GetPath(hinst : HMODULE):string
; var s: string; i: integer; begin result:=''; SetLength(s,MAX_PATH); SetLength(s,GetModuleFileName(hinst,pchar(s),MAX_PATH)); i:= length(s); if i = 0 then exit; while (s[i]<>'\') and (i>0) do dec(i); if i = 0 then result:= s else result:=copy(s,1,i); end; Попробуй так:
Сам же себе и отвечаю на этот ламерский :-) вопрос (не долазил по Help-у по Api): GetModuleFileName - вот как. Попробуй так:


Вопрос 708:
От: Maria Zimakova

Я работаю с пакетом DOA(Direct Oracle Access) и мне нужно организовать
работу нескольких пользователей, которые обращаются напрямую к серверу
Oracle.
Подскажите, пожалуйста, какие существуют фишки для такой задачи, как
лучше все это делать. Например, мне нужно, чтобы если один пользователь
редактирует запись в базе, то другой не мог одновременно делать то же
самое. Годится ли для этого свойство LockingMode для OracleDataSet?
Вроде в Хэлпе написано как раз про это, но я не уверена, что правильно
все понимаю.


Ответить.

Попробуй так:
Все твои проблемы решит сам Oracle... Он на то и РСУБД, что б
ы заботиться о таких вопросах. DAO только обращается к экзепляру с просьбами о том или другом - решает все Oracle. Попробуй так:
Да, примерно так: OracleDataSet1.LockingMode := lmLockImmediate; Но лучше, имхо, решать такие проблемы на уровне БД. Попробуй так:


Вопрос 709:
От: netpilot@tut.by

Необходимо определить дату создания каталога. В справке по WinAPI
такая функция
отсутствует, есть только для файла. Может кто располагает кодом или
веб-ссылкой?


Ответить.

Попробуй так:
HANDLE FindFirstFile( LPCTSTR lpFileName, // pointer >to name of file to search for LPWIN32_FIND_DATA lpFindFileData // pointer to returned information ); Вернет структуру typedef struct _WIN32_FIND_DATA { // wfd DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[ MAX_PATH ]; TCHAR cAlternateFileName[ 14 ]; } WIN32_FIND_DATA; и для файла, и для каталога Это из Win32 Programmer's Reference Структура WIN32_FIND_DATA для Delphi: TWin32FindDataEx = packed record dwFileAttributes: DWORD; ftCreationTime: TFileTime; ftLastAccessTime: TFileTime; ftLastWriteTime: TFileTime; nFileSizeHigh: DWORD; nFileSizeLow: DWORD; dwReserved0: DWORD; dwReserved1: DWORD; cFileName: packed array[0..MAX_PATH - 1] of AnsiChar; cAlternateFileName: packed array[0..13] of AnsiChar; end; Попробуй так:
Все дело в том, что каталог это тоже фал, но у него в атрибутах прописан бит "Directory". Так что дата создания каталога определяется также как и файла. Попробуй так:
'Посмотри внимательней help: The WIN32_FILE_ATTRIBUTE_DATA structure contains attribute information for a file or directory. ^^^^^^^^^^^^^^^^^ Вот это структура возвращается при вызове GetFileAttributesEx Там полная информация о файле или директории, причем Виндам по барабану про что ты спрашиваешь... Попробуй так:


Вопрос 710:
От: Andrew

Существует ли функция преобразования определенного количества
секунд, прошедшего с момента 01.01.1970, в дату?


Ответить.

Попробуй так:
Если я правильно понял то: var MyDateTime:TDateT
ime; CountSecs:Cardinal; ... //это в общем случае как получить дату спустя какое то кол-во сек. //после др. даты} MyDateTime:=StrToDateTime('01.01.1970')+CountSecs/SecsPerDay; Попробуй так:
Такой функции не существует. Точно. Так что придется тебе написать небольшую процедурку... Там надо учесть високосные года ну и там всё остальное. Я как то делал, но чего то она у меня большая получилась. Так что может скинешь как напишешь? Может у тебя оптимальней получится... Попробуй так:


Вопрос 711:
От: Thomas Eagle

Я пытаюсь сделать динамическое заполнение DataSet с помощью компонент,
расположенных на DBCtrlGrid. После заполнения всех компонент в текущей
строке этот DBCtrlGrid  вместо того, чтобы создать новую строку и
переместить в нее курсор, передает фокус на первый компонент текущей
строки
(курсор, соответственно, тоже остается на месте). После повторного
выхода из
последней компоненты в текущей строке, DBCtrlGrid срабатывает правильно
и
создает новую строку. Таким образом, чтобы заполнить строку и перейти в
новую, необходимо два раза пройтись по всем компонентам, расположенным в
DBCtrlGrid. В примерах Delphi DBCtrlGrid работает так же.
Может быть есть хитрый способ заставить эту компоненту работать
правильно?
Если нет, подскажите - нет ли какой-нибудь другой аналогичной компоненты
(но
нормально функционирующей :) и где ее легко и быстро можно достать?


Ответить.

Попробуй так:


Вопрос 712:
От: Андронов Алексей

1.      Можно ли встроить свой пункт в PopUp меню Брузера. Например,
рядом с пунктом <Сохранить объект, как...> стоял бы мой пункт меню
<Скопировать ярлык в мою программу>? Если можно, то как это осуществить?
2.      Такой же, но только обратный вопрос: Как убрать из PopUp меню
Браузера свой пункт меню?


Ответить.

Попробуй так:
Советую почитать литературу по COM-объектам. Попробуй так:


Вопрос 713:
От: NikK

Проект свыше 100 модулей, около 140 тыс. строк object Pascal на Delphi6.
Не заметил, как в одном их основных модулей (его объем около 23 тыс.
строк) вдруг отказал отладчик, а именно: могу установить точку
прерывания, но отладчик его игнорирует, аналогично по клавише F4. В
других модулях все как-будто без изменений.
Еще одна странность - при передаче управления на процедуру в отказавшем
модуле отладчик останавливается на произвольной строке кода, совсем не
связанной с той процедурой, на которую было передано управление.
В откомпилированном EXE-шнике все будто-бы работает правильно, по
крайней мере ошибок программа не дает.


Ответить.

Попробуй так:
У меня была похожая проблема в паре метров исходников, може
т у Вас тоже самое: Портировал часть кода из Unix C, а там "\n" повсюду в исходнике вместо "\r\n" в конце строк - для бедного Delphi5 IDE это был просто шок и строки "поплыли" в дебаге (интересно, что C++Builder этим не старадает). Быстро написал крошечную утилитку и все стало ок. Если тот же случай, то пишите на мыло info@aka.com.ua - вышлю утилитку. Попробуй так:
Попробуй сделать Build All, перед этим удалив (переименовав) все DCU файлы, чтоб заставить Дельфи перекомпоновать и пересобрать заново все модули. Попробуй так:


Вопрос 714:
От: mrph

Где мне найти исходники , программы ТЕСТ (контроль знаний)
Если можно то хоть ссылочку или инфу , плииз


Ответить.

Попробуй так:
Можеш обратится ко мне, пиши на мыло договоримся (пару лет н
азад у меня было подобное задания на диплом). 981142@k108.d1.khai.edu


Вопрос 715:
От: Shamashov

Например у нас есть 10 shape с именами shape1,shape2...,shape10.
Как поменять им свойства в цикле?
for i:=1 to 10 do begin
shape(номер i).brush.color:=clred;
end;


Ответить.

Попробуй так:
'For I:=1 to 10 do TShape(FindComponent('
Shape'+IntToStr(I))).Brush.Color:=clred; Попробуй так:
for i:=1 to 10 do begin (FindComponent('shape'+inttostr(i)) as TShape).brush.color:=clred; end; Попробуй так:
'Можно обойти все компоненты на форме и, в зависимости от того, какого они типа, предусмотреть их обработку. В твоем примере это будет выглядеть примерно так: procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin for i := 0 to ComponentCount - 1 do if (Components[i] is TShape) then (Components[i] as TShape).Brush.Color := clRed; end; Кроме того, если в твоей ситуации, к примеру, не все шэйпы нужно красить, то у всех компонентов имеется праперти Tag, которое тоже можно использовать для своих маленьких удовольствий :). Для тех шэйпов, которые нужно красить, пишешь в тэг 1, и почти как в предыдущем случае: procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin for i := 0 to ComponentCount - 1 do if ((Components[i] is TShape)) and ((Components[i] as TShape).Tag = 1) then (Components[i] as TShape).Brush.Color := clRed; end; Попробуй так:
В Delphi все компоненты на форме имеют свой индекс, начиная с 0. Пример procedure ChangeProperties; var i:Integer; begin for i:=1 to 10 do begin Form1.Components[Index:Integer].Ваши свойства := занчения end; end; Попробуй так:
Самое простое - создавать их динамически из глобальной переменной Shape: array[1..10] of TShape; Сделать это можно в цикле по событию TForm1.FormCreate. Попробуй так:
for I:=1 to Form1.Components.Count - 1 do if (Form1.Components[I] is TShape) then (Form1.Components[I] as TShape).Brush.Color := clRed; Попробуй так:


Вопрос 716:
От: Горщарук Владимир Александрович

Хочу спросить народ, может кто знает сетевые WinAPI
функции для "зашаривания" ресурсов, разумеется с
добавлением пользователей взятых из домена Windows NT
Также хочу знать как "расшаривать" - т.е. снимать доступ
с этих ресурсов
Использовать функцию Command.com - Net Share ...   - не годится :-(
Вызов функций будет происходить на платформах Win9x/Win2000
Если есть принципиальные отличия в вызовах функций или в их
описании, то расскажите об этом по подробнее.


Ответить.

Попробуй так:
Видишь ли, Windows 9x и Windows NT/2000 имеют разные сетевые
компоненты. Так например у них разные библиотеки netapi.dll, netapi32.dll. Так что если сделать программу с использованием технологий NT, то в Win9х она работать не будет. В NT/2000 есть процедура: procedure AddShare; External 'netapi32.dll' name 'AddShare'. Советую воспользоваться набором компонентов NT TOOLS. Скачать их можно на www.torry.net .


Вопрос 717:
От: ura

 
У меня на TQuickReport лежит TQRLabel. При печати возникают странности.
У меня несколько машин в сети и один принтер, так вот на экране
TQuickReport
выглядит на всех машинах одинаково, а вот на на принтер выходят
совершенно
разные страницы. Такое чуство, что при печати меняются характеристики
шрифта
и текст в TQRLabel выводится не полностью (обрезается строчка или две).
Подскажите, что мне с этим делать.
AutoSize и AutoStretch - False;
 


Ответить.

Попробуй так:
Что делать?! Использовать Crystal Reports и НАВСЕГДА забыть п
ро TQuickReport !!!



* В БАЗУ OFFLine * * ВСЕ ВОПРОСЫ * * СПРОСИТЬ * * ПРЕДЛОЖИТЬ * * АРХИВЫ * * СКОЛЬКО НАС *



3. Наша база OFFLine взаимопомощи.
Что на сегодня у нас имеется :
Документы Компоненты Программы Проекты
1. От Валентина Озерова
2. 32 Урока По Делфи4(текст)
3. Непрямоугольные формы
4. CGI на Делфи
5. Справочник по Делфи5
6. От Олега Малышева
7. Перекодировки
8. WinApi
9. От Алексея Малинина
10. 32 Урока По Делфи4(рисунки)
11. МИДАС

1. Выполнение Матем Выражений
2. Управление DOS окнами
3. Rx6_Lib
4. Rx6_Help(rus)
5. Delphi_X
6. Delphi_X_Help(eng)
7. TTable в памяти(без BDE)
8. Банк Клиент


1. Текст под Углом
2. Управляем WinAmp
3. Печать Графики
4. Заменить Строки

Если Вам есть что послать в базу OFFLine то просто в теме письма укажите 'baseoffl' приложите аттач и отправьте письмо. В связи с ограничением размера письма не делайте аттачи более 1500кб.
А ты уже поделился с товарищами чем-нибудь интересным?
Если хотите что-то заказать то пошлите по почте этот запрос , а после двоеточия поставьте две цифры разделенныe запятой, например : ':2,1' - это значит, что вы хотите заказать из второй колонки(Компоненты) первый элемент.
Есть небольшое ограничение - в одном письме можно запросить только что-то одно (обрабатывается только первая строка тела письма)!

Помните! Структура каталогов поддерживается только до очередного выпуска рассылки! Поэтому при запросе всегда берите данные из последнего выпуска!

Если Вы хотите как можно скорее получить ответ на свой вопрос, то
укажите в теме письма - delphiV,иначе письмо будет прочитано значительно
позже, если же у вас есть предложения то в теме письма укажите delphiP.

Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки - это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.

За сим прощаюсь - скорых Вам и качественных программ.

Автор рассылки - Дмитрий.
ICQ - 89533941.

* В БАЗУ OFFLine * * ВСЕ ВОПРОСЫ * * СПРОСИТЬ * * ПРЕДЛОЖИТЬ * * АРХИВЫ * * СКОЛЬКО НАС *



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное