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

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

  Все выпуски  

Delphi для профессионалов - Раздел 'ВОПРОС-ОТВЕТ'


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


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

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

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

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

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


Раздел "Вопрос-ответ"

 

Результаты

Вопрос №29: web-камеры и потоковый звук
Привет. Где можно взять хоть какую-нибудь информацию(мануалы, компоненты, ....) по работе с web-камерами и потоковым звуком. Предо мной стоит задача сделать что-то вроде Net Meeting. Спасибо..

Ответ №1 (Ведущий рассылки Игорь): Относительно потокового звука я не смогу помочь. Сам копал некоторое время назад эту тему, но не по большой необходимости прервал поиск. Что касается работы с Web-камерами... В данном случае используется технология передачи данных TWAIN (также как и для сканеров). Компоненты под TWAIN можешь найти на http://www.torry.net/mmtwain.htm.

Вопрос №34: ненужные дисководы в DriveComboBox
Не могу удалить ненужные дисководы из компоненты DriveComboBox(нужно для программы) и потом сделать обращение к одному из выбранных?

Ответ №1 (Андрей Васильевич Наливайко): Можно использовать не DriveComboBox, а просто ComboBox и в него поместить нужные диски. А определить нужные они или нет можно использовать функции:
GetLogicalDriveStrings
GetLogicalDrives
GetDriveType
и потом использовать обращение к выбранному диску.

Ответ №2 (АндрейV): Самый простой вариант: просто переписать(не перекрыть!) метод BuildList класса TDriveComboBox, т.е. сделать всё так же, как и при наследовании при создании нового компонента, но вместо inherited и своего кода выцепить код из исходников и немного пропатчить его :)

procedure TDriveComboBox.BuildList;
var
  DriveNum: Integer;
  DriveChar: Char;
  DriveType: TDriveType;
  DriveBits: set of 0..25;
 procedure AddDrive(const VolName: string; Obj: TObject);
 begin
   Items.AddObject(Format('%s: %s',[DriveChar, VolName]), Obj);
 end;

begin
  { fill list }
  Clear;
  Integer(DriveBits) := GetLogicalDrives;
  for DriveNum := 0 to 25 do begin
    if not (DriveNum in DriveBits) or (Ненужный диск) then Continue; //<--- Вот здесь вставляешь, что тебе надо(фильтр на диски)
    DriveChar := Char(DriveNum + Ord('a'));
    DriveType := TDriveType(GetDriveType(PChar(DriveChar + ':\')));
    if TextCase = tcUpperCase then DriveChar := Upcase(DriveChar);
    case DriveType of
      dtFloppy: Items.AddObject(DriveChar + ':', FloppyBMP);
      dtFixed: AddDrive(VolumeID(DriveChar), FixedBMP);
      dtNetwork: AddDrive(NetworkVolume(DriveChar), NetworkBMP);
      dtCDROM: AddDrive(VolumeID(DriveChar), CDROMBMP);
      dtRAM: AddDrive(VolumeID(DriveChar), RAMBMP);
    end;
  end;
end;

P.S. Не забудь указать метод как virtual, и должен он быть в секции protected.

Ответ №3 (Березгов Анзор): Напиши свой аналог DriveComboBox-а

Вопрос №36: Как правильно работать с LoginDialog?
Как правильно работать с функцией LoginDialog? Спасибо!

Ответ №1 (Ведущий рассылки Игорь): Это же функция! Работать с ней точно также как и со всеми остальными фунциями. Ты бы хелп по ней почитал раз уж так все тяжело.

Вопрос №62: Файловый менеджер
Прошу всех кто пишет на DELPHI помогите! Мне задали курсовую работу написать файловый менеджер подобный Windows Commander (программа должна взять в себя только основные операции и функции) Поделитесь знаниями, как создать такой файловый менеджер. Преподаватели не помогают, а обратиться мне больше некому.
Предполагаемое решение: Тема дастаточно обширна. Разбей задачу на несколько кусков. Например, отображение панелей, смена дисков, копирование и перенос, удаление, создание папок и т.п. В этом ничего сложного нет, просто объемная тема.

Ответ №1 (АндрейV): Главное, не суетиться :) Основные операции и функции сделать не сложно, тебе понадобятся основные компоненты и их потомки: TPanel(практически всё из панелей), TListBox(левый и правый список файлов), TToolBar и иже с ними. Например, при копировании смотришь, какой элемент списка выбран, ну и копируешь его с помощью BlockRead/BlockWrite в текущую директорию другой панели. Тебе только надо следить за текущими файлами/директориями списков, а всё остальное за тебя сделает Delphi(это если не копать глубже). Можно связать файлы/директории с элементами списков, а потом подставлять имена в функции. Если знаешь Delphi, проблем возникнуть не должно, главное начать :) А вообще, интересная тема (интересно, что другим дали?:)), мне вот задавали PowerQuest Partition Magic Pro сделать(без операций над дисками), так там понавороченней интерфейсу-то будет :)

Вопрос №64: Работа с QREPORT
Как в QREPORT передать текстовый параметр (просто присвоение QLabel.caption:='нужный текст') не работает.

Ответ №1 (Тугаев Олег): Как это не работает?
В uses (в вызывающем модуле) описываешь модуль в каком у тебя QLabel. Обращаешься Form.QLabel.Caption := '';
Попробуй - нет проблем.

Вопрос №65: Проблема с Sockets
Имеем ListBox:
Сервер:

Var i: integer
Begin
  For i:=0 to ListBox1.Items.Count-1 do
    ServerSocket1.Socket.Connections[MyHandle].SendText('Строка'+IntToStr(i));
end;

Почему клиенту все приходит в виде ОДНОЙ строки и как от этого избавиться? Не хотелось бы ничего глобально менять, так как и сервер и сокет практически написаны - проблема с передачей контакт листа (грубо говоря пользователи OnLine). Пробовал в конце каждой строки #13#10 - то же самое... :((

Ответ №1 (Anton): Вообще то так не посылают, в смысле пакеты подряд. Нужно ждать подтверждений, то есть посылаешь пакет (ну или строку), клиент получает, посылает подверждение, сервер посылает следущую и т.д.

Вопрос №66: Пропадают записи в таблице
БД DBase. Случается следующее добавляешь данные в базу - все нормально, добавление происходит успешно. Закрываешь приложение, снова его окрываешь - часть введенных данных может присутствовать, часть отсутствова, могут все введенные данные отсутствовать. Что это может быть, посоветуйте, если кто знает
Предполагаемое решение
: перед закрытием таблицы вставь FlushBuffers.

Ответ №1 (Тугаев Олег): После сделанных изменений делай:
DbiSaveChanges(TTable1.Handle);
В uses добавь модуль BDE.

Ответ №2 (Anton): Надо было бы написать СУБД какую ты используешь, кусочек кода как сохраняешь. Или ты просто table к Dataset к DBGridу привязал и все, типа сам сохранит. Пиши на мыло, расскажу.

Ответ №3 (Andy): Явление характерно для таблиц Paradox'а, но, может быть, с DBas'ом тоже самое...
Вариант решения:

Uses DbiProcs;

 ... //****** Обработчик событий AfterPost для наборов данных **********

procedure TDM.AfterPost(DataSet: TDataSet);
begin
   with DataSet as TTable do dbiSaveChanges(Handle);
end;

Вопрос №67: Бегущая строка
Здравствуйте, с помощью какого компонента и как сделать бегущую строку на форме?

Ответ №1 (Тугаев Олег): Берешь компоненты: TTimer и TLabel - этого достаточно. Подбираешь время смены надписи. Можно писать не на компоненте TLabel, а через свойство Canvas другого компонента (TForm) - так даже лучше меньше дискретность смещения. Все очень просто - почитай про событие TTimer.OnTimer.

Ответ №2 (АндрейV): На первый взгляд: Таймер и метка :)

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Label1.Left>Form1.Width then
    Label1.Left:=-Label1.Width;
  Label1.Left:=Label1.Left+5;
end;

Даже по циклу будет :) Но это неоптимально.

Ответ №3 (Anton): Ну например в VGLIB52 есть компонент Titler. А вообще задача не такая уж и сложная.

Ответ №4 (Цыганков Алексей): Есть прекрассный компонент TSecretPanel, имеющийся в RXTools. Позволяет делать как горизонтальную, так и вертикальную(титры) бегущую строку.

Вопрос №70: Выгрузка в Excel
Как выгрузить содержимое грида в Excel?
Предполагаемое решение: С помощью стандартных компонентов для MS Office, в т.ч. и Excel. В предидущих рассылках принцип подхода в работе с Excel имел место быть.

Ответ №1 (Anton): В примере fodogovor конечно ваша формочка. Точнее это не пример, а функция выгрузки всей таблици. Можно сделать гораздо лучше, с шаблонами, оформлением, но ты этого не спрашивал.

procedure ExportDBGrid(toExcel: Boolean);
var  bm: TBookmark;
     col, row: Integer;
     sline: String;
     mem: TMemo;
     ExcelApp: Variant;
begin
Screen.Cursor := crHourglass;
fodogovor.DBGrideh1.DataSource.DataSet.DisableControls;
bm := fodogovor.DBGrideh1.DataSource.DataSet.GetBookmark;
fodogovor.DBGrideh1.DataSource.DataSet.First;
// создаём объект Excel
if toExcel then
begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'Grid Data';
end;
// Сперва отправляем данные в memo
// работает быстрее, чем отправлять их напрямую в Excel
mem := TMemo.Create(mem);
mem.Visible := false;
mem.Parent := fodogovor;
mem.Clear;
sline := '';
// добавляем информацию для имён колонок
for col := 0 to fodogovor.DBGrideh1.FieldCount-1 do
sline := sline + fodogovor.DBGrideh1.Fields[col].DisplayLabel + #9;
mem.Lines.Add(sline);
// получаем данные из memo
for row := 0 to fodogovor.DBGrideh1.DataSource.DataSet.RecordCount-1 do
begin
sline := '';
for col := 0 to fodogovor.DBGrideh1.FieldCount-1 do
sline := sline + fodogovor.DBGrideh1.Fields[col].AsString + #9;
mem.Lines.Add(sline);
fodogovor.DBGrideh1.DataSource.DataSet.Next;
end;
// копируем данные в clipboard
mem.SelectAll;
mem.CopyToClipboard;
// если необходимо, то отправляем их в Excel
// если нет, то они уже в буфере обмена
if toExcel then
begin
ExcelApp.Workbooks[1].WorkSheets['Grid Data'].Paste;
ExcelApp.Visible := true;
end;
//FreeAndNil(ExcelApp);
fodogovor.DBGrideh1.DataSource.DataSet.GotoBookmark(bm);
fodogovor.DBGrideh1.DataSource.DataSet.FreeBookmark(bm);
fodogovor.DBGrideh1.DataSource.DataSet.EnableControls;
Screen.Cursor := crDefault;
end;

Вопрос №73: TTable
У меня вопрос по объекту TTable. У него есть свойство Filter. Как мне установить фильтр на дату, вернее на период от и до? Немогу подставить туда константное значение даты. Заранее благодарен за ответ. Желательно ответ прислать почтой (olegv@ziet.zhitomir.ua).
Предполагаемое решение: Запросы в Filter составляются по общепринятым правилам SQL. Опускается только часть "SELECT * FROM TableName WHERE" поскольку у нас таблица уже выбрана с помощью данного компонента. А в данном свойстве нужно писать, например, "Field1>100 AND Field1<200". Но не забывай также и про свойство Filtered.

Ответ №1 (Тугаев Олег): Все очень просто:

TTable1.Filter := '(Date>=''' + BeginDate + ''') and (Date<=''' + EndDate + ''');
TTable1.Filtered := True;

Понял? Дату надо вводить в кавычках !!!

Ответ №2 (Шевченко Д. В. (Красноярск)): Попробуй так:

Var S: string;
    Date1, Date2: TDate;
    Table1 : TTable;

Begin
   s:= Format('Date >= ''%s'' and Date <= ''%s''', [DateToStr(date1),DateToStr(date2) ])
   Table1.Filter:= s;
   Table1.Filtered := true;
 ............
End

Ответ №3 (Anton): Раз уж разговор зашед про SQL То тогда уж
where ur_dogovor.in_num_data BETWEEN :dtto and :dtfrom
но я в Oracle делаю
where
(ur_dogovor.in_num_data>=:dtfrom) and(ur_dogovor.in_num_data<=:dtto))

Так точнее получается, хотя в IB глюков не было. Кто хочет со мной поспорить пишите на мыло, ваше мнение мне интересно.

Ответ №4 (Andy): Можно не записывать выражение в свойство Filter, а написать обработчик на событие OnFilterRecord. Это гораздо удобнее.

Вопрос №75: Калькуляция в TdataSet
Подскажите, пожалуйста, как в Delphi5 реализовать сведущее. Есть таблица (TTable с созданными статическими полями) "связанная" с dbf файлом. Необходимо при каждом изменении в каком-либо из ее полей пересчитать величину являющуюся функцией от всех значений этого поля в таблице, например суммой. Необходимо учесть что, значение поля изменятся не только редактированием его в компоненте управления данными, но и путем назначения значения полю в коде программы. Калькуляция в TdataSet.

Ответ №1 (Тугаев Олег): Для этого есть прекрасное свойство TTable.AutoCalcFields, которое должно быть True. В этой процедуре пишешь что хочешь - вызывается-то она каждый раз при изменении любого поля. Потом это значение можно присваивать по своему усмотрению любому другому полю и его уже и записывать окончательно или вводить вручную.

Вопрос №76: ListView
Скажите пожалуйста, как List View связать с TreeView и каким образом корректно добавлять данные в ListView из файла или БД построчно?
Предполагаемое решение: Относительно того как связать - решать тебе, поскольку неизвестно на сколько структуризированы данные. Относительно построчного заполнения ListView:

procedure TForm1.xxx(...)...
var
  x:TListItem;
  z:Integer;
begin
  Table1.Filter:='Field1=68';
  Table1.Filtered:=True;
  for z:=1 to Table1.RecordCount do begin
    x:=ListView1.Items.Add;
        x.Caption:=Table1Name.Value;
        x.SubItems.Add(Table1Size.AsString);

        Table1.Next;
  end;
  Table1.Filter:='';
  Table1.Filtered:=False;
end;

Ответ №1 (Anton): Если не знаешь как строить дерево по табличке ищи компоненты VGLIB52, в них есть компонент vgDBTreeView который строит автоматически. Структура таблички там описана, но собственно для такой задачи нужно только 3 поля: Id, Parent_Id, name. Если интересно как это работает могу дать кусок исходника.

Вопрос №78: Быстрые клавиши
Как отследить нажатие комбинации клавиш (например, Ctrl+Alt+q) в Windows при неактивной форме?
Предполагаемое решение: Поставить глабалный HOOK на это сочетание, если нужны именно эти клавиши.

Ответ №1 (Женя): Используй Win32 API функцию RegisterHotKey.

Вопрос №79: Японские кросворды
Пытаюсь написать алгоритм решения японских кросвордов. Никак не получается анализ нахождения пустых клеток.

Ответ №1 (Толстопят Евгений):
http://www.japancross.by.ru/
http://enotes.diallink.net/

 

 

Новые вопросы

Вопрос №56: Определение активных подключений к IB-серверу
Каким образом можно определить имена всех пользователей (Username) подключенных в данный момент к серверу InterBase?
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №58: Как проверить изменена ли база данных (Paradox Table) после открытия?
Как проверить изменена ли база данных (Paradox Table) после открытия ? Событие OnUpdateData не вызывается при программном добавлении/удалении записи. Table.Modify также делает проверку только текущей записи.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №59: TBX дляTB2k 2.0.13 и TBSkin+
Мечтаю поставить оба вышеуказанных компонента одновременно. Есть какой-нибудь рецепт? Или может быть у одного из них неоспроримые преимущества перед другим? Помогите, plz.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).


Вопрос №61: Как сграбить кусочек "чужой" DLL
Кстати, в одной из последних статей в рассылках, я кажется нашел идею решения проблемы, но т.к. в С++ (как и во всем остальном не очень силен), не знаю как этим воспользоваться... Речь идет о библиотеках для MASM
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №69: Список функций для экспорта из dll
Кто-нибудь знает, как можно получить список имен функций из экспорта в dll?
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №72: ShellListView
Как ShellListView "заставить" отображать содержимое локальной папки (картинки) в режиме "Эскизы страниц"
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №74: Список служб Win2000
как получить список запущенных сервисов в Win2000 & XP
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №77: Перехват сообщений NET SEND
В Win2k есть замечательная команда NET SEND. Спомощью нее можно без каких либо проблем пересылать сообщения между компьютерами в сети. Так вот, встал вопрос о том, чтобы перехватывать таким образом переданные сообщения. (Хочется САМОМУ сделать рульный месенжер). То есть, мне нужно отловить момент, когда пришло сообщение на мой компьютер, ну и естественно само сообщение.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).


Вопрос №81: Перехват вывода строки из консольн. приложения
1) Имеется консольное приложение, которое выводит текстовые сообщения в своём окне (написана на Fortran'е).
2) А также имеется моё приложение написанное на Delphi
Вопрос:
Как и с помощью чего можно осуществить перехват сообщения вывода строки (текста) из консольного приложения, и последующей передачей этой строки в приложение, написанное в Delphi.
Я примерно знаю, что это делается через CreateProcess() -> lpStartupInfo -> hStdOutput, hInOutput. Но вот что делать дальше, я, увы, не знаю...
Я новичок в API поэтому, если вас не затруднит, покажите или пришлите, пожалуйста, маленький примерчик на мой e-mail.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №82: Сетевое приложение
Подскажите пожалуйста как работать в Delphi с локальной сетью. Я тут сделал игру - морской бой, и хочется сделать её сетевой.

Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №83: Как сделать Decision Cube на прямом доступе к IB (FIBC и т.п.)
Кто знает как используя прямой доступ к InterBase реализовать работу с Decision Cube?
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №84: Отправка по Socket-у
Я пытался создать программу для отправки файлов по Socket, но вечно возникали какиета проблемы. То происходило отсоединения (Disconnet) или файл вообще не передавался. Плиззз. Напишите маленький листинчиг передачи файлов на основе Client/Server. Заранее благодарен.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №85: Stack overflow
Здраствуйте.
Помогите, если знаете что можно сделать. Вкратце проблема.
Ком Р-133 32M RAM. Delphi 3
есть несколько переменных следующих типов:
linedat = array[1..512] of double;
InLineDat = array[1..256] of integer;
KodData = array[1..2] of InLineDat;
oneline = array[1..1024] of linedat;
outdata = array[1..1024,1..16] of linedat;
и т.д.
Вообщем было все нормально, пока не написал дополнительную процедуру обработки (из одного массива (object зи парачки приведенных типов) в другой outdata). После этого работать перестало. Т.е. при входе в процедуру, в которой вызывается только что написанная возникает ошибка "Stack overflow". Может что в настройках компилятора можно изменить или комп лучше поменять? Очень надо. Жду с нетерпением. Tolyan.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №86: Частота звука
Как можно по времени определить частоту звука(например из MediaPlayer'a)? Задаёшь время (5с., 3с.) - выводит результат (200 Hz, 300 Hz).
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №87: Компонент Pervasive.SQL 2000i
Помогите пожалуйста найти компонент для Pervasive.SQL 2000i Service Pack 3 General Release - March 2001 и для Btrieve Version 7.90.000 Build 230.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №88: rasapi32.dll
необходимо создать учетную запись для dial-up соединения под w2000/xp. киньте примером, у кого есть... заранее спасибо.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №89: Открывание и сохранение файлов .dbf
Есть форма с dbgrid,datasourse,table,opendialog,savedialog. Как открывать и сохранять файлы .dbf с диска (с одинаковыми полями), чтоб вносить в них изменения?
Заранее спасибо.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №90: Вставка формул через OLE в Excel из Delphi
Вопрос: Как заставить Excel расчитать значения по формуле введенной из Delphi
Значения из Delphi в лист Excel вставляются просто: sheet.cells[x,x]:='10'. А вот при попытке вставки строки типа '=МАХ(E1:F1)', ничего не происходит, Excel воспринимает выражение как строку (#ИМЯ). Но если открыть Excel и нажать на ячейке Enter, расчет чудесным образом происходит.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №91: вопросы по БД
1. есть dbf файл записаный 1С.Бухгалтерией. его char set - ascii в кодировке DOS. Установка драйвера db866ru0 для Dbase в программе не помогает - все равно в DBGrid видны закорлючки. Если загрузить его в Excel и записать"как...", то все смотриться нормально, или зайти в DataBase Explorer и лапками поменять Table Lenguages. Как можно программно установить свойства таблицы на нужную кодовою страницу.
2. Прога работает с Paradox и Dbase. Что нужно чтобы она работала на компе, где не установлен Delphi и BDE.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №92: Связывание таблиц PARADOX
Cвязываю несколько таблиц в Paradox7 по одному полю (используя вторичные индексы),все работает великолепно но при редактировании любой из таблиц возникает ошибка INDEX IS READ ONLY . Помогите!!!
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №93: функция Delphi 6
Мне нужна функция перевода цифр в прописные буквы. Пример 123(Сто двадцать три). Помогите пожалуйста.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №94: Спрятать главную форму
Как сделать, чтобы при закрытии пользователем главной формы (нажатие крестика в системном меню), форма не закрывалась, а пряталась? В обработчике формы OnClose поставить Action := caHide - не помогает, форма закрывается и программа заканчивает свою работу
Предполагаемое решение: Действительно не работает!!! :(. Нужно писать Action:=caNone; Hide;
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №95: Проблемы с печатью графики
В моей программе (Delphi5, Win98) строится диаграмма (график)с помощью компонента TChart (первоначально на форме)на основании введенных пользователем данных, после этого пользователь может распечатать на принтере результаты: сначала идет некоторый текст, затем диаграмма и затем снова некоторый текст. Я пробовал программу на целом наборе принтеров в разных местах (всюду под Win98) и полученные результаты сильно различались: на матричных и струйных принтерах все работает как задумано, а вот на лазерных - большие странности: на старом HP Laserjet II все работает, на HP 1200 при попытке печати - "недопустимая операция", на некоторых других (тоже HP) текст печатается нормально, графические примитивы рисуются нормально, а вот битмэп, в который я копирую диаграмму - не печатается. (Должен заметить, что попытки печати "напрямую" - с помощью методов самого компонента TChart - привели к неудовлетворительным результатам). Не могли бы ли Вы что-нибудь посоветовать в такой ситуации? В общих чертах процедура печати выглядит следующим образом:

procedure TForm1.BtnPrintClick(Sender: TObject);
var
 bm     :tbitmap;
 r      :trect;
 s      :string;
 PX,PY,
 y,x,j  : Integer;
 y1     :integer;
begin
// Рисование диагр. на "виртуальной" канве
  with chart1 do
  begin
     bm:=tbitmap.create;
     bm.width:=chart1.width;
     bm.height:=chart1.height;
     PrintPartialCanvas(bm.Canvas, Rect(0,0,chart1.width,chart1.height));
  end;
with printer, printer.canvas do
  begin
  orientation:=poPortrait;
  pen.style:=styles[1];
  begindoc;
  //Прямоугольник по периметру страницы
  with r do
  begin
  left:=round(0.1*Printer.PageWidth);
  right:=round(0.9*Printer.PageWidth);
  top:=round(0.1*Printer.Pageheight);
  bottom:=round(0.9*Printer.Pageheight);
  end;
  pen.width:=1;
  Rectangle(r);
{ Вывод на печать нескольких строк текста с помощью процедуры
  textout(x,y,'Некоторый текст');
  }
//ОПРЕДЕЛЕНИЕ ПРЯМОУГОЛЬНИКЯ ДЛЯ ПЕЧАТИ ДИАГРАММЫ С СОБЛЮДЕНИЕМ ПРОПОРЦИЙ ДИАГРАММЫ
  x:=round(0.15*Printer.PageWidth);
  R.Left:=x;
  R.Right:=Printer.PageWidth-x;
  y:=y+120;
  R.Top:=y;
  R.Bottom:=y+(r.right-r.left)*chart1.Height div chart1.Width*
  GetDeviceCaps(Printer.Handle,LOGPIXELSY) div
  GetDeviceCaps(Printer.Handle,LOGPIXELSX);
  //ВЫВОД ДИАГРАММЫ НА БУМАГУ
  StretchDraw(r,bm);
  //ПЕЧАТЬ РАМКИ ВОКРУГ ДИАГРАММЫ
  polyline([point(r.left,r.top),point(r.right,r.top),
  point(r.right,r.bottom),point(r.left,r.bottom),point(r.left,r.top)]);
{ СНОВА вывод на печать нескольких строк текста с помощью процедуры textout(x,y,'Некоторый текст');
  }
  enddoc;
  end;
  bm.free;
end;

Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №96: Interbase
можно ли написать триггер, при записи в таблицу записывались бы данные в таблицу Paradox, и еще как записать в таблицу файл?
Предполагаемое решение: Через поля BLOB.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №97: Размеры формы и restore
Как узнать размеры формы после нажатия кнопки restore (в правом верхним углу окна), до того как она нажата? Форма максимизирована или минимизирована
Предполагаемое решение: Через свойство формы WindowState.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №98: Перехват операций с буфером обмена
Хотелось бы сделать так, как сделано в некоторых "качалках" из интернета: если программа запущена(но не активна), то при копировании в другом окне/процессе/приложении моя программа, ничего не изменив в буфере, узнала, что именно скопировали в буфер обмена.
Предполагаемое решение: Вообще за это отвечаею сообщения WM_CUT, WM_COPY, WM_CLEAR, WM_PASTE - работа с буфером обмена. Но в данном случае нужно зарегистрировать окно в "просмотрщиках буфера обмена" с помощью API функции SetClipboardViewer, а после этого обрабатывать сообщение WM_DRAWCLIPBOARD для указанного окна.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №99: Самоуничтожение
Сабж, т.е. как удалить .exe-файл самой программы? Говорят, API CreateFile с флагом удаления после закрытия, у меня не получается.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для HTML-формата).

Вопрос №100: Разрешение экрана
Как в Delphi поменять разрешение экрана? Через ddraw.dll (DirectX) или ещё как?
Предполагаемое решение: Сообщение Windows WM_DISPLAYCHANGE.
Предложить свой вариант решения можно здесь или воспользовавшись формой обратной связи (для 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
Отписаться
Убрать рекламу

В избранное