Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Delphi - проблемы и решения" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Delphi для профессионалов - Раздел 'Вопрос-ответ'
Информационный Канал Subscribe.Ru |
Рассылка: Delphi для профессионалов
Количество подписчиков: 4130

Несу приветствие всем, кто еще не утратил получить ответы на свои вопросы. Пока не смогу писать рассылки ежедневно. Также я должен сделать некоторое лирическое отступление.
В результате ответов в форуме и присланых отзывов на E-mail я делаю вывод, что строка новостей будет организована, но не в плане IT-новостей, а новостей по программированию, в частности - VCL и т.д. Частота выхода - не чаще чем 1 раз в неделю. В тему в этому организовывается раздел на моем сайте по VCL-кам и т.п. О создании сообщу дополнительно.
Итак...
Раздел "Вопрос-ответ"
Результаты
Вопрос №10: Многострочный CheckBox
Подскажите, как можно отобразить в стандартном CheckBox-е более одной строки
текста? Где-то такое встречал в продуктах MS.
Ответ №1 (BOBAH): я бы набросал рядом лейблов и у них в OnClick написал бы CheckBox->Click.
Вопрос №16: Работа с LPT как портом
ввода/вывода
Как организовать ввод и вывод данных через LPT?
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Ответ №1 (Fornit): Можно предложить следующий класс. Для работы с LPT портом установить в PortAddress $378.
TPort = class private FPortAddress:word; FPortData:byte; procedure Write; procedure Reset; procedure Read; public procedure WritePort(PortValue, DataValue: word); procedure ResetPort(PortValue: word); function ReadPort(PortValue: word): word; property PortAddress:word read FPortAddress write FPortAddress; property PortData:byte read FPortData write FPortData; end; {...} procedure TPort.Write; begin WritePort(FPortAddress,FPortData); end; procedure TPort.Reset; begin ResetPort(FPortAddress); end; procedure TPort.Read; begin FPortData := ReadPort(FPortAddress); end; procedure TPort.WritePort(PortValue, DataValue:word); begin DataValue := (DataValue*256)+DataValue; asm Mov ax,DataValue Mov dx,PortValue Out dx,ax end; end; procedure TPort.ResetPort(PortValue: word); begin asm Mov ax,0 Mov dx,PortValue Out dx,ax end; end; function TPort.ReadPort(PortValue: word): word; var ReadData: word; begin asm Mov dx,PortValue In ax,dx Mov ReadData,ax end; Result := Byte(ReadData); end;Ответ №2 (Alexandr Belayev): Используя функции CreateFile, ReadFile etc.
Ответ №3 (Flying.Dutchman): Да в принципе можно по разному, учитывая, что работа идет через винду, надо каким то образом подключать API, я же предпочитаю пользоваться удобным ActiveX, там около 100 функций для работы с периферией компа, такими как Комы и ЛПТешки, думаю, что в новой версии уже есть USB, FireWare и может еще что нибудь. В общем, штучка очень удобная, взятая с шарового диска и позволяющая скрыть все это API программирование, которое как по мне, так очень уж замученно пишется, особенно в Делфи (в билдере немного вроде попроще запись то была). Активикса хоть и не моего производства, но испытывал для управления и обмена данными со встроенными системами реального времени на скорости для ком-порта около 1 МБода и срывов вооще не наблюдалось. Через ЛПТ управлял цифровыми синтезаторами частот, ресиверами, АЦП-ЦАП, делал программаторы под виндой для контроллеров, так что все ОК. Кстати через хелп API функций можно спокойно отыскать код работы с периферией (если активикса для вас проблема).
Вопрос №17: Blob-поля в
базе MDB (Access)
Как правильно делать insert для blob полей в mdb базу?
Провайдер у меня Microsoft.Jet.OLEDB.4.0.
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Ответ №1 (Антон Найко): Для динамических массивов надо использовать не адресс переменнной-массива, а адресс первого элемента динамического массива: @energ[0]. Это правило вообще для всех функций куда мы передаем ссылку на буфер, в том числе и для массивов-параметров функций. В статическом массиве адресс первого элемента совпадает с адрессом переменной-массива (как правило, исключений не встречал). В динамическом переменная-массив это указатель на то, где располагается массив реально (его вообще может не быть, а переменная и ее адресс есть) Некоторые функции коректно распознают динамический массив- встречал такие по-крайней мере (т.е. из правила есть исключения:).
Ответ №2 (Антон Найко): По поводу не-селект запросов: лучше их выполнять через ADOConnection.Execute - самый быстрый способ вообще выполнять любые запросы вообще (в том числе и селекты, по которым нам надо пройти только из начала в конец, например для рассчетов). Надо только задать правильно параметры - есть опция которая и говорит что ответа не будет. То же делать можно и через ADOCommand...
Ответ №3 (Maxim Yakimov): 1. Дело в том, что структура динамического массива в корне отличается от статического. Можно сделать примерно так:
type PArray = ^TArray; TArray = array[0..10000000] of byte; ... var P : PArray; ... GetMem(P, ADOTable1.FieldByName('Field').Size); ADOTable1.FieldByName('Field').GetData(P, true); ... FreeMem(P);
2. Все зависит от версии Delphi. У меня такое было на delphi5, пока не поставил upgrade ADO - d5adoupdate2.exe (лежит где-то на borland.com)
Вопрос №18: Вопрос о компонентах
Как можно добавить свойство к уже существующему компаненту?
Предложить свой вариант решения
можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Ответ №1 (Alexandr Belayev): Не клон, а потомка сделать надо. В которого и добавить необходимое свойство.
Ответ №2 (Желтов Антон): Указывай в качестве предка нужный тебе компонент. Например: как добавить канву на tpanel
unit cPanel; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TCPanel = class(TPanel) private protected public property canvas; //!!!!!!!!!!!!!!!!!!!!!!!!!! published end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TCPanel]); end; end.
Вопрос №19: Перетаскивание
окна без рамки
Как перетаскивать окна без рамки (т. е. с Borderstyle="bsNone)."
Предполагаемое решение: При нажатии кнопки мыши - если она находится на форме
отправлять Windows сообщение, что под мышкой - заголовок окна.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Ответ №1 (Winnukem): Когда-то давно я где-то нашел вот это. Можно повесить и на событие image, и label; тогда форма будет перетаскиваться за них. Вот код:
procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; begin ReleaseCapture; perform(WM_SysCommand, SC_DragMove, 0); end;Ответ №2 (Eugene V. Geraschenko): Вот у меня есть один способ, правда он рассчитан на быстрые компы. Нужно создать Timer с Enabled = False и Interval = на ваше усмотрение (в зависимости от производительности), например 50.
procedure TfrmMenu.Timer1Timer(Sender: TObject); begin Top:= Mouse.CursorPos.Y - FormY; Left:= Mouse.CursorPos.X - FormX; end; procedure TfrmMenu.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Timer1.Enabled:= True; FormX:= X; FormY:= Y; end; procedure TfrmMenu.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Timer1.Enabled:= False; end;Ответ №3 (Виталий Джангл):
private procedure WMNCHITTEST(var Msg: TMessage); message WM_NCHITTEST; ... procedure TForm1.FormCreate(Sender: TObject); begin SetWindowLong(Handle, GWL_STYLE, GETWINDOWLONG(Handle, GWL_STYLE) and (not WS_CAPTION)); Height := ClientHeight; end; procedure TForm1.WMNCHITTEST(var Msg: TMessage); begin inherited; Msg.Result := HTCAPTION; end;P.S. от ведущего: Этот способ - мой выбор. Я им пользуюсь уже давно, когда возникает необходимость.
Ответ №4 (Dr.IMP):
unit DragMain; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCrtls; type TForm1 = class(TForm) Button1: TButton; procedure ButtonClick(Sender: TObject); private procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCCHitTest; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1. WMNCHitTest(var M: TWMNCHitTest); begin inherited; if M.Result = htClient then M.Result := htCaption; end; procedure TForm1.Button1Click(Sender: TObject); begin Close; end; end.
procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; begin ReleaseCapture; perform(WM_SysCommand, SC_DragMove, 0); end;Ответ №5 (Vlad): Я делаю так:
interface .............................................. public procedure MoveAllPlace(var Msg:TMessage);message WM_NCHITTEST; .............................................. implementation .............................................. procedure TForm1.MoveAllPlace(var Msg:TMessage); begin inherited; if Msg.Result=1 then Msg.Result:=2; end; ..............................................Ответ №6 (Fornit): Предложенное ведущим можно реализовать следующим образом - включить в форму обработчик сообщения WM_NCHITTEST
procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHITTEST; ... procedure WMNCHitTest(var M: TWMNCHitTest); begin inherited; if M.Result = htClient then M.Result := htCaption; end;Ответ №7 (Желтов Антон): Я использую очень простой метод и не совсем возможно корректный, но действенный. В примере image2 задний фон формы, и за нее можно таскать
procedure TfoAbout.Image2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin image2.OnMouseMove:=Image2MouseMove; _x:=x; _y:=y; end; procedure TfoAbout.Image2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin left:=x-_x+left; top:=y-_y+top; end; procedure TfoAbout.Image2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin image2.OnMouseMove:=nil; end;
Вопрос №21: Включение
в Delphi-project другого exe-файла
Как можно включить в разрабатываемый проект готовый exe-файл?
Предполагаемое решение: Вставить его в ресурс и откомпилить компилятором ресурсов.
Далее читать из ресурса своего EXE-файла.
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Ответ №1 (Ведущий Рассылки Игорь): Как я и говорил раньше: Вставить его в ресурс и откомпилить компилятором ресурсов. Далее читать из ресурса своего EXE-файла.
Пример:
Файл Dek.rc (Его нужно откомпилить компилятором ресурсов - получим файл Dek.res) 1 RCDATA "..\Dekanat.exe"
Файл для извлечения EXE-файла "из себя": //ОБЯЗАТЕЛЬНО УКАЗАТЬ СЛЕДУЮЩУЮ СТРОКУ {$R Dek.res} // Подключаем созданый ресурсный файл procedure TUpdater.LoadDek(F:String); var Stream : TResourceStream; // Объект - поток ресурсов begin try Stream:=TResourceStream.CreateFromID (HInstance,1,RT_RCDATA); // Создаем поток FileSetAttr(F,$0); // Сбрасываем атрибуты уже существующего файла Stream.SaveToFile(F); // Сохраняем поток в файл finally Stream.Free; // Освобождаем поток end; end;
Вопрос №22: ReadOnly аттрибут
файлов?
Я сделал тест(опросник) для проверки студентов , но есть проблема не подключаются
фаилы с вопросами если установить атрибут ReadOnly (чтоб не потерли). В институте
WinNT4 если это важно.
Предполагаемое решение: Если проблема именно в аттрибутах файлов, в чем я
очень сомневаюсь, то потробуй поработать с переменной FileMode.
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Ответ №1 (Alexandr Belayev): Если файлы ищутся через FindFirst/FIndNext то смотри какие там аттрибу выбираемых файлов стоят.
P.S. В вашем случае лучше воспользоваться назначением прав доступа. Это более правильное решение обеспечивает защиту со стороны ОС.
Вопрос №23: Как отобразить
html документ на форме
Имеется html документ, например в текстовом файле. Как отобразить его на форме?
Предполагаемое решение: А компонент TWebBrowser не подходит?
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Ответ №1 (degraf@af.kz): Воспользоватся HTML браузерами с сайта http://www.pbear.com. Среди них существует free компонент THtmlLite с ограниченными возможностями.
Ответ №2 (Andrey): Во многих случаях естественней воспользоваться стандартными браузерами вызывая их из своего приложения с помощью ShellExecute.
Ответ №3 (Желтов Антон): Вот и все собственно. Этого достаточно.
WebBrowser1.Navigate(apl_path+'help\help.htm');
Вопрос №24: Отображение
адреса значения в элементе типа TEdit
Как перевести адрес переменной в строчное представление? Видел, что в некоторых
программах (omatic, например) указывается какое-либо значение, находящееся в памяти,
и адрес этого значения. Так вот, хотелось бы видеть этот адрес не как указатель,
а как строку. Подскажите, please!?
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Ответ №1 (Антон Найко): Указатель привести к LongWord, использовать IntToHex... Правда это будет адресс в логической памяти от 0 до 2(4)Гб (Плоская модель памяти). Физический адресс узнать сложнее...
Ответ №2 (Женя): Всё просто :)
Допустим есть переменная nVariable. Тогда её адрес строкой можно найти так :
Edit1.Text := IntToStr(Longint(@nVariable));Ответ №3 (Alexandr Belayev):
p:pointer; label1.caption:=IntToHex(integer(p), 8);
Вопрос №25: Пример экспертов
на Delphi
Не могли бы Вы написать пример Экспертов на Delphi! Мне очень интересно как
они пишуться!
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Ответ №1 (Sergey Buyanov): Примеры и описание можно посмотреть на http://www.tempest-sw.com/opentools/. Также есть Wizard-ы для составления экспертов на http://www.gexperts.org/. Готовые экспетры с исходным кодом есть на www.torry.net.
Новые вопросы
Вопрос №26: ReadKey
В "Паскале" есть процедура ReadKey, которая отсутсвует в Delphi.
Процедура позволяла при работе программы управлять курсором с помощью клавиш на
клавиатуре с точностью до одного пикселя. Компонент UpDown в Delphi не удобен,
т.к. занимает место в рабочем окне. Как можно в Delphi-6 использовать клавиши
управления курсором?
Предполагаемое решение: Только
используя события onKeyUp, onKeyDown, поскольку даже свойство KeyPreview класса
TForm в данном случае не сработает. И даже так мы получим не "ReadKey".
Вся проблема залючается в том что клавиши управления курсором, точно также как
и F1..F12 и т.п. относятся к классу VK(Virtual
Key)
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №27: Вывод
значения в LPT порт
Почему нижеприведенный код не работает в Win XP, а в Win 98/Me все нормально?
И как с этим бороться.
asm
mov dx,$378
mov al,$ff
out dx,al
end;
Предполагаемое решение: Для начала посмотри ответ №1 к вопросу 15.
Вообще WinXP/2k/NT - другого класса операционки против Win9x. Я лично с LPT не
работал, но предположу, что как и множество других операций требуется получить
привелегии в данном случае для записи в порт LPT напрямую.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №28: Вопрос
о трее
Здраствуйте, я хотел бы спросить как в Delphi можно отправляя иконку в трей
и убирая окно, считывать нажатия клавиш в любом другом окне (Word, Excel, блокнот
и др.). Например с отображением этих символов на форме скрытого окна, или как
определять нажатие клавиши + нажатие мыши, или просто миши. Спасибо.
Предложить свой вариант решения
можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №29: web-камеры
и потоковый звук
Привет. Где можно взять хоть какую-нибудь информацию(мануалы, компоненты, ....)
по работе с web-камерами и потоковым звуком. Предо мной стоит задача сделать что-то
вроде Net Meeting. Спасибо..
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №30: Создание файлов
Здравствуйте!!!
У меня возникают проблемы с созданием файлов. Я пользуюсь процедурой AssignFile
и для создания Rewrite, но во время прогона проги, выдается сообщение о том, что
либо файл уже существует, либо файл создан и дальше ничего не происходит. В то
время мне нужно что бы прога записывала данные в этот файл. Организовал код следующим
образом:
// Остальные переменные описаны в другом разделе procedure NAME; //Описание процедуры var p: Real; u: Byte; begin Road:='{файл}.dat'; Dest:='{каталог}'+Road; try AssignFile(Cals,Dest); Rewrite(Cals); begin mmResults.Lines.Add(''); for u:=i1 to i1 do begin {расчет некоторой величины} mmResults.Lines.Add({вывод результата}); Graph.Series[3].AddXY({построение графика по результату}); // Строим график WriteLN({запись в файл}); end; CloseFile(Cals); end; except on E: EInOutError do ShowMessage('При выполнении файловой операции возникла ошибка'+ ' № '+ IntToStr(E. ErrorCode)+': '+SysErrorMessage(GetLastError)); on E: EAccessViolation do ShowMessage('Ошибка!: '+SysErrorMessage(GetLastError)); end;Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №31: Как
Програмно Создать Папку На Delphi7 Или 6
Как Програмно Создать Папку На Delphi7 Или 6?
Предполагаемое решение: MkDir('C:\Folder').
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №32: Свойства объектов?
Допустим на форме имеется n объектов CheckBox. Каким образом сразу всем этим
объектам сменить свойство Checked (или надо для каждого писать ChecBox.Checked:=true,
а если n=100)?
Предполагаемое решение: Сделать это циклом: for i:=0 to Form1.ComponentCount
do (Form1.Components[i] as TCheckBox).Ckeched:=True;
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №33: Высокосные
года
Задача. Необходимо определить какие года являются високосными по заданным значениям
n и m (n<m) если n+1 до m
Предполагаемое решение: if (year mod 4)=0 then VysokosnyGod:=True;
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №34: ненужные
дисководы в DriveComboBox
Не могу удалить ненужные дисководы из компоненты DriveComboBox(нужно для программы)
и потом сделать обращение к одному из выбранных?
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №35: Использование
красивых кнопок Windows XP
Я уверен, что вы знакомы с Windows XP, точнее с ее интерфейсом, а еще точнее
- с ее красивыми сглаженными кнопками. Как можно их использовать в своих программах?
Предполагаемое решение: Если использовать
стандартные компоненты VCL и запускать программу под WinXP, то сама операционка
их такими и рисует.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №36: Как
правильно работать с LoginDialog?
Как правильно работать с функцией LoginDialog? Спасибо!
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №37: Регулярные
выражения
Доброе утро! Коль уже пошёл разговор про фильтрованный поиск в строке по маске,
то может есть (или Вы знаете где взять) и более продвинутый поиск, а именно поиск
по регулярным выражениям. Я встречал такой поиск на си, а меня бы обрадовал на
паскале.
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №38: Работа
с RichEdit
Как узнать положение текстового курсора в пикселах? А точнее : какое сообшение
нужно послать
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №39: Delphi
Fatal Error
Почему у меня появляется FATAL EROR там где я даже ничего не изменял?
Предполагаемое решение: У меня
такое происходило на Delphi 3. Лечилось переходом на следующую версию среды разработки.
Предложить свой вариант решения можно здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Вопрос №40: TMemo
Привет! Не подскажет ли кто, где найти метод, отвечающий за прорисовку компонента
TMemo, перерыл почти весь VLC, но ничего не нашел. TCustomEdit, ничего такого
не имеет, и все его ниследники тоже! Помогите, если кто что знает.
Предложить свой вариант решения можно
здесь
или воспользовавшись формой обратной связи (для HTML-формата).
Все ответы присылайте по адресу: delphi-reply@igp.org.ua
Все подсказки присылайте по адресу: delphi-hint@igp.org.ua
Со всем списком советов можно познакомиться по адресу: http://igp.org.ua/delphine/.
Наш проект Delphine можно найти по следующей ссылке: http://igp.org.ua/products/delphine/.
Заходите в наш форум: Форум Delphi-профессионалов. Адрес: http://forum.igp.org.ua/.
Здесь Вы найдете ответы на все Ваши вопросы!
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||