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

Delphi для профессионалов

  Все выпуски  

Delphi для профессионалов - Раздел 'Вопрос-ответ'


Информационный Канал Subscribe.Ru


Профессиональная реклама в интернет. Русскоязычный рекламный брокер.

Рассылка: Delphi для профессионалов

Количество подписчиков: 4130
Рассылка 'Delphi для профессионалов'

Выберите действие:
Заглавие (одной строкой) :
Содержание :

От кого :
Не показывать мой e-mail другим пользователям


Несу приветствие всем, кто еще не утратил получить ответы на свои вопросы. Пока не смогу писать рассылки ежедневно. Также я должен сделать некоторое лирическое отступление.

В результате ответов в форуме и присланых отзывов на 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-ask@igp.org.ua
Все ответы присылайте по адресу: 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/.
Здесь Вы найдете ответы на все Ваши вопросы!

Выберите действие:
Заглавие (одной строкой) :
Содержание :

От кого :
Не показывать мой e-mail другим пользователям



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

В избранное