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

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

  Все выпуски  

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


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

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


Процесс, иногда, намного интереснее
результата(Если не затягивать!).

ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС


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

Хочу предложить выдержку из письма одного из подписчиков.
Думаю - многие задумаются. Я, в свою очередь, полностью
солидарен с автором этого письма.

Nik:

>А предложение мое скорее не предложение, а что-то вроде совета начинающим
>и тем, кто не умеет, а скорее, не хочет читать книжки и прочую литературу.
>В рассылке попадаются настолько элементарные и простые вопросы, которые
>лежат совершенно на поверхности - только бери. Понимаю, что они не всем
>кажутся простыми, но ответы на них можно найти, нажав F1 или открыв
>оглавление книжки. Понимаю, что куда проще спросить у знающих людей,
>как и что, которые поделятся примером и остается только перенести текст
>в программу. Но пользуясь таким методом теряются те знания,которые можно
>приобрести в процессе самостоятельного поиска ответа и которые могут
>оказаться куда прочнее и эффективнее полученных. Особенно это относится
>к тем, кто решил всерьез заняться программированием.

Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Спрашиваю всех и каждого.
2. Лучший ответ последнего выпуска.
3. Очередные вопросы.
4. Отвеченные вопросы.
5. Ищу подельника.
~~~~~~~~~~~~~~~~~~~

1. Спрашиваю всех и каждого.
----------------------------

Хочу спросить(на этот раз я у Вас) у всех подписчиков этой рассылки.
Есть ли среди Вас люди которым в силу своих обязанностей приходится
заниматься не только программированием, но еще и сопровождением
чужих задач. Конкретно, мне было бы интересно пообщаться с теми,
кто сталкивался с продуктами Citrix - MetaFrame и WinFrame.
Если таковые есть, то очень прошу откликнуться.

mailto:DTarasov@kms.dvgd.ru

2. Лучший ответ последнего выпуска.
-----------------------------------
Так и хочется вставить фанфары, да ведь пишем, а не говорим или поем!
Вопрос конечно :((( , но ответ достоен уважения, особенно на такой
вопрос.

Вопрос:

Создаю *.ini файл, в нем:

[Options]
Dametr_valov_ustanovki=123, 321, 456, 654

Запятые в данном случае разделяют числа, мне нужно в ComboBox поместить
эти четыре значения, чтобы
выпадающий список показал:
123
321
456
654
Помогите советом или лучше кодом примера.

Ответ:
Sozdai na forme button s name='LoadBtn' i ComboBox1
a kod vot on.

-----------------------
unit main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, inifiles;

type
TForm1 = class(TForm)
LoadBtn: TButton;
ComboBox1: TComboBox;
procedure LoadBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const
SECTION_NAME: string='Options';
ID_NAME: string='Diametr_valov_ustanovki';
DELIMETER: string=',';


procedure TForm1.LoadBtnClick(Sender: TObject);
var
IniFileName, bufstr: string;
MyIni: TIniFile;
i: integer;
begin

{Opredelnie imeni ini file; ParamStr(0)-eto imya exe-module application }
IniFileName:=StringReplace(ParamStr(0), '.exe', '.ini',
[rfReplaceAll, rfIgnoreCase]);

try
{Creating ini-file}
MyIni:=TIniFile.Create(IniFileName);

{reading string from ini-file}
bufstr:=MyIni.ReadString(SECTION_NAME, ID_NAME, '');

{replacing delimeter with CR and LF}
ComboBox1.Items.Text:=StringReplace(bufstr, DELIMETER, #13#10,
[rfReplaceAll, rfIgnoreCase]);

{triming leading and trailing blanks}
for i:=0 to ComboBox1.Items.Count-1 do
ComboBox1.Items[i]:=trim(ComboBox1.Items[i]);


MyIni.Free;

except
on e:Exception do ShowMessage(e.Message);
end;


end;

end.


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



Вопрос 262:

От: anton


Здравствуйте.
Скажите как сделать для проигрывателя PlayList.Если у кого-нибудь есть
исходник PlayListа,то пришлите мне на мыло.
Заранее благодарен.Антон.
mailto:anton777@online.sinor.ru



Ответить.

Ответ 1:


Вопрос 263:

От: Ернар Шамбаев

Здравствуйте!

Скажите, пожалуйста, как эффективно (другими словами,
быстро, надежно и значительно) сжать данные, содержащиеся
в типах Pointer и TStream?


Ответить.

Ответ 1:


Вопрос 264:

От: Филинов Денис

Вопрос:

Всем привет!
Программеры подскажите как в дельфях справиться с этими проблемами:
1. Как в Delphi осуществить работу со сканером (т.е. скинарование и
передачу изображения в программу, для дальнейшей обработки).
2. Как в Delphi осуществить прием и передачу факсов по факс-модему.
Просьба прислать пример программы или ссылку на документацию
по этим вопросам.
Заранее благодарен!




Ответить.

Ответ 1:


Вопрос 265:

От: "Алексей"


:Здравствуйте. Только не смейтесь над моим вопросом, я чайник. Как,
допустим, при нажатии кнопки запускалась другая форма, окно? Например,
окно о создателе. Что нужно написать в обработчике событий onClick?
Спасибо.
Phiber


Ответить.

Ответ 1:


Вопрос 266:

От: Сергей Сарычев

: Здравствуйте, господа программисты!
У меня имеется такой вопрос: Как сделать так, чтобы форма имела не
стандартный вид прямоугольного окна, а другой, необходимый
програмисту. Например, форма в виде круга или овала.
Как это можно реализовать?




Ответить.

Ответ 1:


Вопрос 267:

От: "Тромбола Евгений"

Зравствуйте!
Нужна Ваша помощь :) !
Сообственно вопрос: "Нужно полностью заблокировать клавиатуру на время
выполнения программы. Как это реализовать?"

С уважением, yozhik.



Ответить.

Ответ 1:


Вопрос 268:

От: Алексей Малиновский

Господа, подскажите где взять UNOReport?
Заранее спасибо.
С уважением, Алексей.


Ответить.

Ответ 1:


Вопрос 269:

От: Anna Ginkul

Кто знает можно ли в объекте типа TStringGrid закрашивать разными
цветами отдельные ячейки, если да то как!? Может какой-то другой
компонент обладает такими свойствами?
Макс...


Ответить.

Ответ 1:


Вопрос 270:

От: LYNX


1:Как сделать полноэкранный режим программы?
2:Как можно менять разрешение и цветность в программе?


Ответить.

Ответ 1:


Вопрос 271:

От: Загорский Антон

Здравствуйте
У меня вот какой вопрос:
Есть ListBox, и туда постепенно добавляются Item.Естественно, возникает
полоса прокрутки, но при добавлении следующего Item окно listBox не
прокручивается, чтобы стала видна самая последняя Item, а остаётся прежним
лишь бегунок скроллинга движется вверх, а надо чтоб он всегда был внизу.
Скажите пожалуйста, как это сделать.

Amber



Ответить.

Ответ 1:


Вопрос 272:

От: kaktooss@mail.ru

День добрый!

Есть вопрос. Как из дельфи отследить выход машины в инет? ситуация
такая: есть локальная сеть, на одной машине - модем, и когда эта
машина выодит в инет, мониторчик, пердварительно засунутый туда
посылает сообщение по сети. Проблема в том, как выловить факт
выхода.
Заранее благодарен.
P.J.




Ответить.

Ответ 1:


Вопрос 273:

От: Dmitriy

Шахматы.
Нужно найти всевозможные комбинации на шахматной доске выполненной в
IMAGE(8x8), 8-ми ладей таким образом что-бы они не угрожали друг другу.
Нужно очень срочно! Заранее спасибо.






Ответить.

Ответ 1:


Вопрос 274:

От: "Демьян Коваль"


Вопрос: При работе с пограммой возникает ошибка "Invalid filter
expression character: .". "Танцы с бубном" вокруг BDE и установки
"параметров страны" результатов не принесли. Интересно, что на двух
машинах программа заработала без сучка-задоринки и после выставления
всех параметров как у них-> результат "0".
Хотя ошибка и возникает, в базе создается запись по условию
фильтра,а на печать не выводится.
Подскажите на какие грабли наступил и как с них слезть, времени
осталось 2 недели.


Ответить.

Ответ 1:


Вопрос 275:

От: maxxx

Можно ли использовать вычисляемые поля таблицы БД для отбора в операторе
SELECT в SQL. Если да, то как?
Роман.


Ответить.

Ответ 1:


Вопрос 276:

От: Irinka


Вопрос:
Привет! Может кто подскажет: как легче всего под Windows работать с
COM-портом?
Заранее спасибо. V-tek@mail.ru <mailto:V-tek@mail.ru>


Ответить.

Ответ 1:


Вопрос 277:

От: _rip_

Здравствуйте... Проблемка вот такая...Я хочу заполнить HTML форму,
например на сайте http://
www.mts.ru/sms <http://www.mts.ru/sms> , нажать там же на кнопочку,
прочитать результат отправки и вернуться обратно при этом не открывая по
возможности окно броузера... Нужно очень срочно, если можно...а доступ в
Инет ограничен, чтобы доки почитать :-( Обращаюсь к Вам, может поможете
примерчиком, а дальше разберусь... Заранее глубоко благодарен... Руднев
Олег


Ответить.

Ответ 1:


Вопрос 278:

От: Dizzer

Здравствуйте All.

Нужно запустить програму до загрузки винды(пока иконки на десктопе не
появились) и пока эта программа не завершится загрузка не
продолжается, наподобе как окошко "Вход в Виндоус" при загрузке.
Винда 98, Ме.




Ответить.

Ответ 1:


Вопрос 279:

От: Юрий Геннадьевич Батяев

Здравствуйте!
Вопрос такого плана. Мне необходимо рассылать сообщения от одного
Юзера другим с помощью стандартного НОВЕЛЛовского (версия NOVELL5.0)
из программы написанной на ДЕЛФИ. Стандартного SEND.exe в NOVELL5.0
нет. Сейчас (и в документации) можно послать сообщение используя
только мышку, а мне необходимо с командной строки.

С уважением, Юрий.





Ответить.

Ответ 1:


Вопрос 280:

От: Олег Гончаренко

HELP!
в моей БД храняться изображения, хочу сделать слайд-шоу
применяю такой код:

procedure TForm1.ToolButton15Click(Sender: TObject);
begin
with Table1 do
begin
Table1.First;
while not Eof do
begin
Timer2.Enabled := True; /включаю таймер/
Table1.Next;

дале следует код вывода изображений на форму ........

end;
end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
StatusBar1.Panels[3].Text := 'Слайд - шоу';
Timer2.Enabled := False; /выключаю таймер/
end;

но в результате после нажатия кнопки через какое-то время
вижу только последнюю картинку....
Может есть другой способ задать задежку в 2-3 секунды между
переходом от записи к записи (Table1.Next)




Ответить.

Ответ 1:


Вопрос 281:

От: Geints Yuri

:Привет, коллеги!

Может кто подскажет, как можно получить доступ к курсору, который
создает какой-нибудь TADO... компонент у клиента на машине? Как
сохранить его (курсор) в нормальную DBF-ку?

С наилучшими пожеланиями,
Юрий




Ответить.

Ответ 1:


Вопрос 282:

От: Katkov Sergey


:Использую SQL Server 2000 и Delphi 5. В одной из таблиц находится
BLOB-поле. На форме TDBImage. Если картинка попадает в TDBImage через
TTable, то все нормально, а если через TQuery - то при размере поля больше
нескольких килобайт значительная часть картинки оказывается черной. Причем
не с начала, а как-то в середине. Не подскажет ли многоуважаемые знатоки,
как бороться с таким глюком?

Best regards
Sergey Katkov (katkov@zorya.com.ua)




Ответить.

Ответ 1:


Вопрос 283:

От: Вадим Шешунов

Здравствуйте!

Каким образом можно в программе на Делфи регулировать громкость звука
колонок так, как это делает стандартный регулятор Виндов? Применение
функции auxSetVolume почему-то не дает никакого эффекта.
:


Ответить.

Ответ 1:


Вопрос 284:

От: Nostradamus

Как отловить создание окна другой программы и получить её handle?



Ответить.

Ответ 1:


Вопрос 285:

От: Богер Евгений

Как узнать букву, соответствующую CD-ROM'у из Дельфы?
Заранее благодарен.



Ответить.

Ответ 1:




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



Вопрос 95:

От: Sam Savinov

Добрый день Дмитрий.
Почему у меня (я работаю в 5-м Delphi) при сохранении
больших проектов, пропадают события привязанные к компанентам
или формам. Напр. Form1 - событие "OnShow" я пишу к нему код.
Так вот, код остается, а в инспекторе привязки к нему с самой формы нет.
Привязываю по новой, а после "переоткрытия" привязки опять нет.
Тоже самое происходит и с "мемо" в которые текст был занесен в
процессе проектирования. Может заплатка какая нужна, или
еще чего? Помогите плз., а то я уже совсем расстроился.


Ответить.

Ответ 1:
Не знаю, поможет ли тебе мой совет, но - у меня была такая проблема - Делфи не запускалась (или запускалась
с дикими глюками) если автоматически загружался последний проект. Выход один - почистить ключик
HKEY_CURRENT_USER\Software\Borland\Delphi\5.0\Session\Project. Или делать Close All перед выходом из
Делфи.
Ответ 2:
Обычно это происходит когда делается Ctrl-X, Ctrl-V
над компонентами


Вопрос 96:

От: cinlena

Привет DTarasov,
Мне нужно написать почтовую программу. Пытаюсь использовать компоненту
SMTP. Пример из хелпа не работает. Если есть рабочий пример, подскажи
где взять или исходники подобных программ.


--
С уважением Лена
mailto:cinlena@mail.ru




Ответить.

Ответ 1:
Приветствую!

Пример использования TNMSMTP компонента для отправки почты:

// что за программа отправляет
nmsmtpSender.PostMessage.LocalProgram = 'My mail client';
// адрес почтового сервера
nmsmtpSender.Host:='smtp.myhost.com';
// мой SMTP логин
nmsmtpSender.UserID:= 'slava';
// от кого?
nmsmtpSender.PostMessage.FromAddress:= 'from_me@myhost.com';

// коннектимся на хост
NMSMTPSender.Connect;
// подготовим Subject
nmsmtpSender.PostMessage.Subject:='Hello!';
// Подготавливаем сообщение
nmsmtpSender.PostMessage.Body.CommaText:='Hello world!!! :-) ';
// Кому?
nmsmtpSender.PostMessage.ToAddress.Text:= 'somebody@somewere.com';
// Отправляем письмо
nmsmtpSender.SendMail;
// после отправки отваливаем от хоста
nmsmtpSender.Disconnect;


Вопрос 97:

От: Mark Ermakov

Господа всезнающие программисты!
Подскажите пожалуйста, как осуществить вывод данных на LPT порт?
По моему в бейсиковой лексике это OUT [порт], [число] - а как в DELPHI?
Заранее благодарен.
Марк.
mark@newtel.lv


Ответить.

Ответ 1:
Начните с компоненты PrintDialog.
Ответ 2:
В DOS надо было
addr:=MemW[$0040:$0008]; {LPT1}
addr:=MemW[$0040:$00A0]; {LPT2}
addr D0..D7 - данные
7 6 5 4 3 2 1 0
* . . . . . . . D7 (pin 9), 1=High, 0=Low
. * . . . . . . D6 (pin 8), 1=High, 0=Low
. . * . . . . . D5 (pin 7), 1=High, 0=Low
. . . * . . . . D4 (pin 6), 1=High, 0=Low
. . . . * . . . D3 (pin 5), 1=High, 0=Low
. . . . . * . . D2 (pin 4), 1=High, 0=Low
. . . . . . * . D1 (pin 3), 1=High, 0=Low
. . . . . . . * D0 (pin 2), 1=High, 0=Low
addr+1 Статус
7 6 5 4 3 2 1 0
* . . . . . . . Busy . . (pin 11), high=0, low=1 (inverted)
. * . . . . . . Ack . . (pin 10), high=1, low=0 (true)
. . * . . . . . No paper (pin 12), high=1, low=0 (true)
. . . * . . . . Selected (pin 13), high=1, low=0 (true)
. . . . * . . . Error. . (pin 15), high=1, low=0 (true)
. . . . . * * * Undefined
. . . * . . . . Selected (pin 13), high=1, low=0 (true)
. . . . * . . . Error. . (pin 15), high=1, low=0 (true)
. . . . . * * * Undefined
addr+2 Контроль
7 6 5 4 3 2 1 0
* * . . . . . . Unused (undefined on read, ignored on write)
. . * . . . . . Bidirectional enable on PS/2 ports, see below
. . . * . . . . Interrupt control, 1=enable, 0=disable
. . . . * . . . Select . . (pin 17), 1=low, 0=high (inverted)
. . . . . * . . Initialize (pin 16), 1=high, 0=low (true)
. . . . . . * . Auto Feed (pin 14), 1=low, 0=high (inverted)
. . . . . . . * Strobe . . (pin 1), 1=low, 0=high (inverted)

Далее

Port[addr{/+1/+2}]:=d;

В виндах нельзя прочитать сегмент BIOS, но ассемблером посылать данные
в порт можно, номера портов почти везде одни и те же, но никто не
застрахован от того, что Win тоже захочет туда что-нибудь записать.

C Уважением T-fly.

PS. Я как раз сейчас распаял LPT-устройство и занимаюсь его отладкой,
до драйверов дело дойдёт, наверное недели через 2-3. Надеюсь на
конструктивное сотрудничество. Мой адрес KN2@newmail.ru
Ответ 3:
Попробуйте использовать ActiveX компонент IO ActiveX control
Взять можно здесь WWW.JSPAIN.COM.
Можно выводить любую последовательность символов на любой
из COM или LPT портов.
Ответ 4:
Если нужно кидать прямо в порт, то вставка на ASSM

Procedure Out_Port(OutPort:Word;bt:Byte);
begin
asm
mov dx,OutPort
mov al,bt
out dx,al
end;
end;

где OutPort - адрес порта принтера
bt - байт

Если фраза: "адрес порта принтера" ни о чем не говорит,
то лучше использовать AssignPrn из unit Printers

uses Printers; //подключаем unit

procedure TFmain.BitBtn1Click(Sender: TObject);
var PrintText:TextFile;
begin
AssignPrn(PrintText); //связываем файл с принтером
Rewrite(PrintText); //Устанавливаем в начало
Printer.Canvas.Font.name := 'Courier New'; //Выбираем фонт (необязательно)
Printer.Canvas.Font.Size := 9; //Выбираем размер (необязательно)
Printer.Canvas.Font.color := clBlack; //Выбираем цвет (необязательно)
Writeln(PrintText,'Хрясь и пополам!' ); //Печатаем
CloseFile(PrintText); //Закрываем
ShowMessage('ОТПЕЧАТАНО'); //сообщаем (необязательно)
end;
Ответ 5:
Вот функция для чтения из LPT-порта :

function LPTRead: byte;
var br: byte;
begin
asm
MOV DX,$379;
IN AL,DX;
MOV br,AL;
end;
br:=br OR $07;
Result:=br XOR $80;
end;

Прошу прощения, не было времени переделать на вывод...
Ответ 6:
Можно использовать три процедурки на ассемблере:
(под NT видимо работать не будет :)

Вывод байта данных:
procedure PortData(dan: Byte) assembler;
asm
mov al,dan
mov dx,378h (для LPT2 278h)
out dx,al
end;

Вывод байта управления:
procedure PortUprav(dan: Byte) assembler;
asm
mov al,dan
mov dx,37Ah (для LPT2 27Ah)
out dx,al
end;

Прием байта состояния:
Function PortStatus:Byte; pascal;
begin
asm
mov dx,379h (для LPT2 279h)
in al,dx
mov @result,al
end;
end;

Вопрос 98:

От: Алексей Малиновский

Здраствуйте господа!

Создаю БД для InterBase с помощью DataBase Desktop, и при создании
определённой БД система выдаёт сообщение об ошибке: ""Invalid table
create request" и БД не создаётся!

Господа подскажите в чём проблема?
Заранее спасибо.
С уважением, Алексей.


Ответить.

Ответ 1:
Ну лучше либо писать script самому, либо попробовать QuickDesk (http://www.ems-hitech.com/rus/quickdesk/)
Ответ 2:
В чем проблема не скажу. Но я создавал БД для InterBase следующим путем:
Создавал SQL файл, например makedb.sql (см. вложения) и выполнял его из утилитки, по-моему Interactive SQL,
что-то в этом роде. Эта утилитка поставляется вместе с InterBase-ом.
У меня получалось.
Ответ 3:
Лучше использовать обычный SQL-script и запустить его через WISQL32,
который входит в поставку Interbase.
При выполнении он после каждого оператора напишет очему не выполняется и
код ошибки, а по документации можно посмотреть что к чему.


Вопрос 99:

От: arni

Приветик!
Вопросик таков: в моей проге документы на печать выводятся DOSовским
способом (для скорости печати) через AssignFile(f,'lpt1'), при этом
контроля принтера из программы не происходит. Т.е. не известно
включен/не включен, работает/остановлен паузой принтер - соответственно
прога повисает при остановке принтера без возможности корректно снять
ее. Как запрограммировать хотябы событие недоступности печати или
остановки ее?
Спасибо.


Ответить.

Ответ 1:
Это можно сделать, например, так:

procedure PrintStringList(TextReport: string);
var
S: string;
P: TextFile;
Report: TStringList;
i: Integer;
begin
Report := TStringList.Create;
Report.Text := TextReport;
try
Assign(P,'PRN');
Rewrite(P);
try
for i:=0 to Report.Count - 1 do begin //выводим текст построчно
S := Report.Strings[i];
Writeln(P,S);
end;
except
ShowMessage('Возникла ошибка во время печати.' + #10#13 +
'Проверьте состояние принтера!' + #10#13 + 'Возможно Вы не
вставили бумагу или' + #10#13 + 'нажали кнопку Пауза.' + #10#13 +
'' + #10#13 + 'Устраните неполадки и повторите печать!');
end;
Close(P);
except
Close(P);
end;
Report.Free;
end;
Ответ 2:
Я, конечно, может уже опоздал, но вдруг ...
Еще на Паскале использовал ASM чего и вам желаю, поскольку прога под DOS =>
Для простоты на Form кнопка и метка

Function AH_ : Byte;
begin
asm
mov AH, 2
mov DX, 0
int 17h
mov @Result, AH
end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := IntToStr (AH_)
end;

Если ASM не проблема, то AH выглядит так
7 - 1=не занят
6 - 1=подтверждение
5 - 1=нет бумаги
4 - 1=on-line
2,3 - не используются
0 - 1=тайм-аут


Вопрос 100:

От: ==MAX==

Зравствуйте!

1. Как в Дельфи получить список всех запущенных приложений?
2. Как нарисовать что-нибудь (какие-нибудь примитивы) на Desktope, а
потом стереть их?

Спасибо.




Ответить.

Ответ 1:
Ищи в хелпах описание CreateToolhelp32Snapshot.
Ответ 2:
Привет!
Отвечаю на второй вопрос.
Интересный такой способ:
Создаём окно у которого свойство WindowState:=wsMaximized;
BorderStyle:=bsNone;
при создании этой формы пришем:

procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Brush.Style:=bsClear;
end;

И рисуем на этой форме как на обычной. С помощью Canvas. При закрытии формы
рабочий стол очистится.

Или это я не правильно понял вопрос?
Ответ 3:
Пример рисования на DeskTop'е:
procedure ...;
var
dc : hdc;
begin
dc := GetDc(0);
MoveToEx(Dc, 0, 0, nil);
LineTo(Dc, 300, 300);
ReleaseDc(0, Dc);
end;

Стереть можно обновлением экрана:
SendMessage(FindWindow('Progman', 'Program Manager'), WM_COMMAND, $A065, 0)

Определить размеры DeskTop'а можно так:
procedure ...;
var
r : TRect;
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @r, 0);
Memo1.Lines.Add(IntToStr(r.Top));
Memo1.Lines.Add(IntToStr(r.Left));
Memo1.Lines.Add(IntToStr(r.Bottom));
Memo1.Lines.Add(IntToStr(r.Right));
end;
Ответ 4:
1. Cпеpва:
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
// получение снимка состояния системы
2. Process32First() - получене инфоpмации о пеpвом пpоцессе
3. Далее в цикле Process32Next() - получение инфоpмации о следующем
пpоцессе в списке
Ответ 5:
Вот юнита, которая показывает все открытые файлы в системе :

unit Unit1;
interface

uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls, Buttons;

Type
TForm1 = class(TForm)
Panel1 : TPanel;
ListView1 : TListView;
SpeedButton1: TSpeedButton;
procedure ButtonRefreshClick(Sender: TObject);
procedure Form1Activate(Sender: TObject);
procedure Form1Create(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

Type
PDIOC_Registers=^TDIOC_Registers;
TDIOC_Registers=record
reg_EBX: DWORD;
reg_EDX: DWORD;
reg_ECX: DWORD;
reg_EAX: DWORD;
reg_EDI: DWORD;
reg_ESI: DWORD;
reg_Flags: DWORD;
end;

const
Move_Flag = 1;
VWIN32_DIOC_DOS_IOCTL = 1;
FileTypes: Array[0..4]of String=('Normal файл',
'Mapped файл',
'DLL или исполняемый',
'','Своп файл');

fmOpenRead = $0000;
fmOpenWrite = $0001;
fmOpenReadWrite = $0002;
fmShareCompat = $0000;
fmShareExclusive= $0010;
fmShareDenyWrite= $0020;
fmShareDenyRead = $0030;
fmShareDenyNone = $0040;

AccessModes: Array[0..3]of String=('Чтение','Запись','Чтение/Запись','');
amReadOnly =0;
amWriteOnly=1;
amReadWrite=2;

function OpenVWin32:THandle;stdcall;
begin
result:=CreateFile('\\.\vwin32',
0, 0, Nil, 0, FILE_FLAG_DELETE_ON_CLOSE, 0);
end;

function CloseVWin32(hVWin32:THandle):Boolean;stdcall;
begin
result:=CloseHandle(hVWin32);
end;

procedure GetOpenFilesList;
const
MAX_PATHNAME=128;
var
LogicalDrive,
LD,
cb : DWORD;
hVWin32 : THandle;
Regs : TDIOC_REGISTERS;
EndList : Boolean;
buf : Array [0..MAX_PATHNAME-1] of Char;
i : Integer;
s : String;
Li : TListItem;
Sr : TSearchRec;
Begin
LD:=GetLogicalDrives;
Form1.ListView1.Items.Clear;
hVWin32:=OpenVWin32;

if hVWin32=INVALID_HANDLE_VALUE then exit; // Значит это заглушка из NT

for LogicalDrive:=1 to 26 do begin
i:=0;
if (LD and LogicalDrive)<>0 then
repeat
FillChar(regs,sizeof(regs),0);
regs.reg_EBX := LogicalDrive;
regs.reg_EDX := DWORD(Addr(buf));
regs.reg_ECX := $486D;
regs.reg_EAX := $440D;
regs.reg_ESI := i;

EndList:= DeviceIoControl(hVWin32, VWIN32_DIOC_DOS_IOCTL,
@regs, sizeof(regs), @regs, sizeof(regs), cb, Nil);

EndList:=(not EndList) or (regs.reg_Flags and Move_Flag<>0);
if not EndList then begin
OemToAnsi(buf,buf);
s:=buf;
FindFirst(buf, $FF, Sr);
Li:=Form1.ListView1.Items.Add;
while (s[length(s)]<>'\') do delete(s,length(s),1);
delete(s,length(s),1);
Li.Caption:=Sr.FindData.cFileName;
{Здесь можно вставить фильтр на "s"}
With Li.SubItems do begin
Add(s);
Add(AccessModes[regs.reg_EAX and 3]);
Add(FileTypes[regs.reg_ECX]);
if (regs.reg_EAX and 7)=fmOpenRead then s:='Чтение';
if (regs.reg_EAX and 7)=fmOpenWrite then s:='Запись';
if (regs.reg_EAX and 7)=fmOpenReadWrite then s:='Чтение/Запись';
Add(s);
end;
end;
Inc(i);
until EndList;
end;
if hVWin32<>INVALID_HANDLE_VALUE then CloseVWin32(hVWin32);
end;

procedure TForm1.ButtonRefreshClick(Sender: TObject);
begin
GetOpenFilesList;
end;

procedure TForm1.Form1Activate(Sender: TObject);
begin
GetOpenFilesList;
end;

procedure TForm1.Form1Create(Sender: TObject);
var
c:TListColumn;
begin
ListView1.ViewStyle:=vsReport;
With ListView1.Columns do begin
c:=Add; c.Caption:='Имя файла'; c.Width:=100;
c:=Add; c.Caption:='Путь'; c.Width:=200;
c:=Add; c.Caption:='Режим доступа'; c.Width:=90;
c:=Add; c.Caption:='Тип файла'; c.Width:=100;
c:=Add; c.Caption:='Режим шары'; c.Width:=80;
end;
end;

end.
Можно отфильтровать *.exe - будут только запущенные ехе-шники.
Ответ 6:
> 1. Как в Дельфи получить список всех запущенных приложений?
> смотри описание функций API:

CreateToolhelp32Snapshot
Process32First
Process32Next

> 2. Как нарисовать что-нибудь (какие-нибудь примитивы) на Desktope, а
> потом стереть их?

DC:=GetDC(0);
а на этом DC уже рисуй
Ответ 7:
1.Как в Дельфи получить список всех запущенных приложений?

function EnumWindowsProc(h: hwnd; lparam: dword): BOOL; stdcall;
var
WindowName: array[0..255] of char;
r: integer;
begin
r := GetWindowText(h,windowname,255);
if (IsWindowVisible(h)) and (GetParent(h) = 0) and (r<>0) then
begin
form1.memo1.lines.add(WindowName);
end;
Result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.clear;
(EnumWindows(@EnumWindowsProc, 0));
end;

Другой вариант:

procedure TForm1.Button1Click(Sender: TObject);
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Не показываем:}
IF (Wnd <> Application.Handle) AND {-Собственное окно}
IsWindowVisible(Wnd) AND {-Невидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
ListBox1.Items.Add(StrPas(buff));
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
ListBox1.ItemIndex := 0;
end;

2.Как нарисовать что-нибудь (какие-нибудь примитивы) на Desktope?
Procedure DrawOnScreen;
Var DC:HDC;
DesktopCanvas:TCanvas;
begin
DC:=GetDC(0); // получили DC экрана
// (или DC:=GetDC(GetDesktopWindow) для рабочего стола)
try
DesktopCanvas:=TCanvas.Create;
DesktopCanvas.Handle:=DC;
..................
// здесь рисуем на Canvas экрана
..................
finally
ReleaseDC(0,DC);
DesktopCanvas.Free;
end;
end;

С уважением, SeRj
Ответ 8:
Отвечаю по порядку:
1:)Можно использовать функцию EnumWindows. Она по очереди передает
хэндлы всех главных окон в процедуру обработки (в примере это EnWin).
Зная хэндл окна, можно с помощью функции GetWindowText узнать его
заголовок, а если вместо нее вставить GetWindowThreadProcessId -
идентификатор процесса, создавшего окно.
Пример- test.pas
2) Единственный способ, который я знаю - создать невидимое окно,
растянуть его на весь экран , рисовать в нем, а потом свернуть.

Вопрос 101:

От: Алексей Малиновский

Здраствуйте!
Господа, у меня вопрос по InterBase 6: создал таблицы в БД (с помощью
ISQL), но чуток неправильно (в смысле структуру надо немного изменить),
можно ли как-нибудь теперь изменить структуру уже созданной таблицы. Я
что-то я никак не допру где это сделать и как?
Заранее спасибо.

С уважением, Алексей.


Ответить.

Ответ 1:
alter table add column ...
alter table drop column ...
alter table modify column ...

А лучше всего запусти IBConsole
Ответ 2:
В isql
use <base>
alter table <mytable> drop column <badcolumn>
alter table <mytable> add <goodcolumn>

RTFM^ IB SQ Reference --> ALTER TABLE
Ответ 3:
Возьми прогу "IB Expert" по адресу www.ibexpert.com
<http://www.ibexpert.com> и она решит все твои проблемы с Interbase,
для своих она бесплатна.

очень рекомендую!!!!!

Вопрос 102:

От: oo

Hello DTarasov,

Скажите как в Delphi работать с модемом под win2k
я хочу написать диалер и еще вопрос как написать мониторинг
чтоб писать лог работы модема с хелпом я не разобрался

--
Best regards,
oo mailto:oo@mail.spbnit.ru




Ответить.

Ответ 1:
Для того, что бы это сделать берешь компоненты Async Pro и ваяешь. Если диалер простой, то
пишется без труда. Лог работы с модемом поддерживается этими компонентами. Можно посмотреть то, что
в модем посылалось, что принималось из него и т.д. Async Pro 2.5 для дельфи 3.0 я могу тебе кинуть с исходниками
если желаешь. .)
Ответ 2:
Я тут экспериментировал с модемом, и потому высылаю такой юнит:

Он может инициализировать СОМ-порт, а затем пишешь в него как в файл, например:

ATDP 8 W 22 66-12-72

ну и остальное нужно вычитать в книжке по модему.

unit ModemUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TModem = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
function WriteInPort(Text: string): integer;
{ Private declarations }
public
hComm: THandle;
function initialize(CommPort: PChar): boolean;
procedure uninitialize;
{ Public declarations }
end;

var
Modem: TModem;

implementation

{$R *.DFM}

function TModem.initialize(CommPort: PChar): boolean;
var DCB: _DCB;
begin
hComm := CreateFile(CommPort, GENERIC_WRITE, 0, nil, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
if (hComm = INVALID_HANDLE_VALUE) then begin
Result := False;
Exit;
end;
GetCommState(hComm, DCB);
BuildCommDCB('baud=19200 parity=N data=8 stop=1', DCB);
SetCommState(hComm, DCB);
SetCommMask(hComm, EV_BREAK);
Result := True;
end;

procedure TModem.uninitialize;
begin
if (hComm <> INVALID_HANDLE_VALUE) then begin
EscapeCommFunction(hComm, SETBREAK);
CloseHandle(hComm);
hComm := INVALID_HANDLE_VALUE;
end;
end;

function TModem.WriteInPort(Text: string): integer;
begin
WriteFile(hComm, Text, SizeOf(Text), Result, 0);
end;

procedure TModem.Button1Click(Sender: TObject);
begin
initialize(PChar(Edit1.Text));
end;

procedure TModem.Button2Click(Sender: TObject);
begin
uninitialize;
end;

end.
Ответ 3:
Есть такая библиотека Magneta Systems взять ее можно
http://www.magsys.co.uk/delphi/ . Компоненты данной библиотеки как раз
обеспечивают работу с модемом, соединение с I-net и т.д. Под Win2000
работают без проблем.


Вопрос 103:

От: Sergey Kukotenko

Здравсвуйте. Подскажите, как из приложения открыть
диалоговое окно настроек последовательного порта...
Спасибо.
С уважением, Сергей.


mailto:sergzoom@mail.ru

Ответить.

Ответ 1:
Если тебе нужно узнать настройки порта, то это можно сделать используя API функции

function GetCommConfig(hCommDev: THandle; var lpCC: TCommConfig; var lpdwSize: DWORD): BOOL; stdcall;
function GetCommMask(hFile: THandle; var lpEvtMask: DWORD): BOOL; stdcall;
function GetCommProperties(hFile: THandle; var lpCommProp: TCommProp): BOOL; stdcall;
function GetCommModemStatus(hFile: THandle; var lpModemStat: DWORD): BOOL; stdcall;
function GetCommState(hFile: THandle; var lpDCB: TDCB): BOOL; stdcall;
function GetCommTimeouts(hFile: THandle; var lpCommTimeouts: TCommTimeouts): BOOL; stdcall;

Почитай в хелпе описание по ним. Для вызвова их необходимо порт открыть функцией CreateFile...
Ответ 2:
Разве в Дельфи такое диалоговое окно есть?
По-моему нужно написать свое. В качестве каркаса высылаю:

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TModem = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
function WriteInPort(Text: string): integer;
{ Private declarations }
public
hComm: THandle;
function initialize(CommPort: PChar): boolean;
procedure uninitialize;
{ Public declarations }
end;

var
Modem: TModem;

implementation

{$R *.DFM}

function TModem.initialize(CommPort: PChar): boolean;
var DCB: _DCB;
begin
hComm := CreateFile(CommPort, GENERIC_WRITE, 0, nil, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
if (hComm = INVALID_HANDLE_VALUE) then begin
Result := False;
Exit;
end;
GetCommState(hComm, DCB);
BuildCommDCB('baud=19200 parity=N data=8 stop=1', DCB);
SetCommState(hComm, DCB);
SetCommMask(hComm, EV_BREAK);
Result := True;
end;

procedure TModem.uninitialize;
begin
if (hComm <> INVALID_HANDLE_VALUE) then begin
EscapeCommFunction(hComm, SETBREAK);
CloseHandle(hComm);
hComm := INVALID_HANDLE_VALUE;
end;
end;

function TModem.WriteInPort(Text: string): integer;
begin
WriteFile(hComm, Text, SizeOf(Text), Result, 0);
end;

procedure TModem.Button1Click(Sender: TObject);
begin
initialize(PChar(Edit1.Text));
end;

procedure TModem.Button2Click(Sender: TObject);
begin
uninitialize;
end;

end.


Вопрос 104:

От: sanglier

Задача состоит в том, чтобы из программы вывести результаты ее работы
в текстовый файл, место которого на рабочем столе. Я знаю, что в
русской версии Windows 98 адрес рабочего стола
C:\Windows\Рабочий стол\, и все прекрасно работает. Однако на работе
у меня установлена английская версия Windows 2000 и адрес рабочего
стола C:\Documents and Setting\Desktop. Как сделать так, чтобы
программа благополучно выводила текстовый файл на рабочий стол в
обеих версиях?


Ответить.

Ответ 1:
Посмотри в хелпе функцию SHGetSpecialFolderLocation
Ответ 2:
Здесь функция для отлова большинства системных папок.

Type
TSystemPath=(Desktop,StartMenu,Programs,Startup,Personal,
winroot, winsys);

Function GetSystemPath(SystemPath:TSystemPath):string;
var p:pchar;
begin
try
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;

OpenKey('\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell
Folders', True);
case SystemPath of
Desktop: Result:=ReadString('Desktop');
StartMenu:Result:=ReadString('Start Menu');
Programs:Result:=ReadString('Programs');
Startup:Result:=ReadString('Startup');
Personal:Result:=ReadString('Personal');
Winroot:begin
GetMem(p,255);
GetWindowsDirectory(p,254);
result:=Strpas(p);
Freemem(p);
end;
WinSys:begin
GetMem(p,255);
GetSystemDirectory(p,254);
result:=Strpas(p);
Freemem(p);
end;
end;
finally
CloseKey;
free;
end;
if (result<>'') and (result[length(result)]<>'\')
then result:=result+'\';
except
on e:exception do showmessage(e.message);
end;
end;
Ответ 3:
Вот, раскопал в своих залежах информации:

Uses Registry;

procedure TForm1.Button1Click(Sender: TObject);
var Registry:TRegistry;
begin
Registry := TRegistry.Create;
try
Registry.RootKey := HKey_Current_User;
Registry.OpenKey
('Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', False);
Showmessage(Registry.ReadString('Desktop'));
finally
Registry.Free;
end;
end;
Ответ 4:
Самый простой способ - проверить наличие указанных папок
и в ту, которая откликнется, поместить ссыску. :)
Ответ 5:
uses
ShlObj;

function ShellGetFolderPath(IDFolder: Integer): string;
var
Path: array[0..MAX_PATH] of Char;
IDList: PItemIDList;
begin
FillChar(Path, SizeOf(Path), 0);
if Succeeded(SHGetSpecialFolderLocation(0, IDFolder, IDList))
then SHGetPathFromIDList(IDList, Path);
Result := Path;
end;

Usage:
X := ShellGetFolderPath(CSIDL_PROGRAMS);
Ответ 6:
function DesktopPath:string;
var
p:PItemIDList;
Path:Array[0..Max_Path-1] of WideChar;
begin
SHGetSpecialFolderLocation(form1.handle,
CSIDL_DESKTOP,
P);
SHGetPathFromIDList(p,@Path[0]);
result:=StrPas(@Path[0]);
end;

И не забудь включить в секцию uses модуля модуль ShlObj. Успехов.


Вопрос 105:

От: Alexey

Привет всем!
как построить красивый 3D - график (поверхность)?

С уважением, Алексей.


Ответить.

Ответ 1:
Попробуйте использовать компоненты TCHartPro
С компонентами поставляется большое количество примеров.
Ответ 2:
Здравствуйте. Для построения 3D графиков лучше использовать пакет OpenGl. Есть хорошаю книга для работы с этим
пакетом. Автор М.Краснов. "OpenGl, графика в проектах Delphi".
Можно пойти другим путем. Самому смоделировать трехмерный объект. Я занимался такими вещами, работало
медленновато, но для простых объектов красивые картинки получались. Если есть вопросы пишите мне на
grachev@che.nsk.su.
С уважением, Евгений.




5. Ищу подельника.
------------------
Astanin Dmitry:
Ищу желающих помочь мне в создании программы, обеспечивающей
одновременный доступ нескольких пользователей с
разных компьютеров в лок. сети (в этом я вообще чайник) и аудит
событий с сохранением результатов в защищенном
файле .. Дима kinch-ch@mail.ru

Лобастов Николай:
Здравстуйте, господа программисты.

У меня в голове куча идей, только не знаю куда с ними сунуться.
Два дня назад пришел к одному выводу и хочу с вами
поделиться. Может кто уже так делает. Может кто дельный совет даст.

Я работаю в банке в отделе разработки и столкнулся с тем, что мы часто
повторяемся в написании каких-то вещей.

Что такое хоз. деятельность любой организации? Это производство мат.
ценностей или услуг и ведение учета и отчетности. К чему сводится
отчетность? К документообороту. Что такое документ? Это объект с набором
свойств и методов. Никому не приходилось создавать компоненты TDocument,
TPlategka, TPKO, TRKO? Можно описать такие свойства как база данных, таблица,
номер, дата, название, методы такие как создать документ, провести документ,
распечатать документ и все это разместить на палитре компонент. И при
разработке чего-то еще нового в организации или в какой-то
фирме для организации просто кидаешь их на форму или в датамодуль
и описываешь реакцию на события.

Такая библиотека сильно облегчит автоматизацию предприятия, а разработчикам
поможет заработать кучу денег. Ведь это же златая кладезь.

Жду ответов и предложений. - Lobastov@kedr.kts.ru




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

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

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

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

ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться Рейтингуется SpyLog

В избранное