← Май 2001 → | ||||||
1
|
2
|
3
|
5
|
6
|
||
---|---|---|---|---|---|---|
7
|
8
|
9
|
10
|
12
|
13
|
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
За последние 60 дней 2 выпусков (1-2 раза в 2 месяца)
Сайт рассылки:
http://www.interface.ru, www.itshop.ru
Открыта:
16-01-2001
Адрес
автора: comp.soft.win.mydelphi-owner@subscribe.ru
Статистика
-3 за неделю
Проблемы и решения в Delphi #16
Проблемы и решения в Delphi - выпуск 16 от 4.05.2001.
Начало всех начал не ноль,а единица,
но тогда кто мы были когда нас не было?
ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС
Доброго Вам времени суток уважаемый читатель.
Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Фреймы в Delphi.
2. Очередные вопросы.
3. Отвеченные вопросы.
4. Ищу подельника.
~~~~~~~~~~~~~~~~~~~
Некоторое время раздумывал - как лучше рассматривать дальнейшие темы и
решил, что не стоит больше дергаться от одного к другому. Будем
последовательно перебирать все компоненты стандартного набора 5-го
Delphi и искать в них что-нибудь интересное.
1. Фреймы в Delphi.
---------------------
'Frames' - на мой взгляд чрезвычайно полезная компонента. Если откинуть
условности, то это форма в форме. Грубо говоря, можно наделать таких форм
и менять, например, функциональность и вид Вашей программы в зависимости
от определенных условий(Это не то-же, что менять кожу - не перепутайте.).
И раз уж я назвал его формой, то отсюда и начальный шаг по его созданию
должен быть как у формы, а не как у компоненты. Точнее даже два в одном.
Вообщем так.
Через меню 'File/New/Frame' создаем фрейм - появляется до боли знакомое
окно форы, с разве что немного другими свойствами. Далее можно делать на
нем все, что угодно.
Однако, не забываем, что пока создан всего сам фрейм и он у нас ни к чему
не привязан. И тут нужен второй шаг - теперь берем компоненту и ложем ее
на форму Вашего основного проекта. Сразу появляется окно выбора фрейма-
'Select frame to insert'. Причем, если Вы наделали, несколько фреймов,
то, соответственно, Вам их все и предложат.
Итак, из всего вышесказанного можно подчеркнуть лишь одно -
прежде чем пользоваться компонентой Frame нужно создать сам фрейм.
Пошли дальше. Самый простой способ осуществить подмены фреймов(для
изменения функций программы) это делать Visible тому фрейму который
сейчас нужен. Вообще, конечно спорный вопрос - стоит ли наращивать
размер программы для таких целей, но.... задачи бывают разные.
Еще одна полезность этой компонеты в том, что она позволяет организовать
скролл(как вертикальный, так и горизонтальный) для целого набора
инструментов. Т.е. если Вам необходимо разместить на форме очень много
всего, а места не хватает, то фрейм - идеальное решение. Примером может
служить настройка сортировщика писем в известной почтовой программе
'TheBat'.
2. Очередные вопросы.
---------------------
Вопрос 247:
От: Comp_otdel
Здравствуйте!
У меня вопросик. Есть программа - EXE-шник.
Запускаешь ее - садится спокойно в трей, никого не трогает.
Щелкаешь по ней 2 раза мышкой - вываливается окно (логично!).
Так вот можно ли как-то из моей программы на Delphi заставить
ее не разворачиваться при щелчке мышкой. Или в Windows какие
настройки есть? И можно ли как-то прогу вообще из трея выкинуть,
но не из памяти?
Спасибо.
Вадим.
Ответить.
Ответ 1:
Вопрос 248:
От: Вадим Шешунов
:
Здравствуйте!
Я пишу БД, в BLOB-поле которой помещаю мультимедийный файл mp?, wav.
Можно ли проиграть содержимое этого поля каким-то образом? То есть,
сделать что-то вроде TDBImage для музыки.
Спасибо! Вадим. vadims@mksat.net <mailto:vadims@mksat.net>
Ответить.
Ответ 1:
Вопрос 249:
От: Hecht Andreas
Hecht Andreas
Люди, поможите!
Очень нужен простейший исходник SEA BAT (морской бой) на С++
или DELPHI !
Очень срочно.
<mailto:hecht@chat.ru> hecht@chat.ru
Ответить.
Ответ 1:
Вопрос 250:
От: Ернар Шамбаев
Здравствуйте!
У меня есть программа с TreeView. В дереве много узлов и подузлов.
Пользователь, естественно, по ним перемещается.
Подскажите, пожалуйста, как реализовать навигатор, то есть пару кнопок с
выпадающим меню для того, чтобы быстро перейти в предыдущий топик -
следующий топик, как в MS Internet Explorer'е (Назад-Вперед)?
Заранее благодарен
Ответить.
Ответ 1:
Вопрос 251:
От: "Пуфик"
Хочу раскрасить колонку в DBGrid в зависимости от имеющегося значения
в ячейке. ВИGridDrawColumnCell прекрасно работает, однако при установке
курсора на ячейку она рисуется тем же цветом, что и невыбранная.
Как с этим бороться?
Заранее благодарен, Alex.
Ответить.
Ответ 1:
Вопрос 252:
От: alx
:
Я пишу консольный почтовый клиент. Как мне инициализировать TNMSmtp ?
(У меня нет ни одной формы). Про такой метод как Create я слышал, но
что указать в параметре Owner ? Напишите пример, пожалуйста, а то я
ещё только начинающий программист.
Ответить.
Ответ 1:
Вопрос 253:
От: Igor Tolstik (www.irop.de)
Здрасте!
Это опять я надоедаю со своими глупостями...
А можно как-то форму сделать невидимой, а кое-что, что на ней, видимым?
Н-р: 100 кнопок и только одна закроет форму...
А как сделать форму круглой и красивой, с круглыми кнопками?
Благодарю, если пойму!
Ответить.
Ответ 1:
Вопрос 254:
От: Igor Tolstik (www.irop.de)
Я бы хотел очень плохому человеку посылать воспоминания обо мне.
Но он поставил защиту...
Как мне быть анонимным? Или может есть уже где-то такая
e-mail-программка,
но не с "русским" лицом и просто "To" "From" "Subject" "Attachment"
"Text".
Может кто-то напишет и мне подарит!? Размещу у себя на странице и
обязательно укажу источник!
Danke www.irop.de <http://www.irop.de> Игорь
Ответить.
Ответ 1:
Вопрос 255:
От: anton
Здравствуйте.
Скажите я сделал ScreenSaver,перевёл из *.exe в *.scr.Как написать процедуру
чтобы он работал как настоящий ScreenSaver,чтобы при движении мыши он
исчезал и выполнял бы другие функции.
Антон.
Ответить.
Ответ 1:
Вопрос 256:
От: Ернар Шамбаев
Здравствуйте!
Какие компоненты являются наилучшими для написания
сокет-приложений (постоянный прием/отправка файлов)
для локальной сети и для модемных соединений?
Я пробовал с компонентами NetMasters (что на странице
FastNet), однако у NMUDP, похоже, ограничение на
буфер. Слышал, что в шестую версию Delphi включены
компоненты Indy. Насколько хороши они? Еще вроде бы
пользуются успехом сетевые компоненты какого-то
француза (Piette, хотя могу ошибиться).
Ответить.
Ответ 1:
Вопрос 257:
От: Ернар Шамбаев
Здравствуйте!
Одно из полей моей базы данных - BLOB.
Периодически при редактировании этого поля
в сетевом варианте вылетает ошибка
"Blob has been modified". Приходится
завершать работу приложений и паковать
БД. Только в результате этих действий
возможно продолжение нормальной работы.
Объясните, пожалуйста, в чем причина ошибки?
Ответить.
Ответ 1:
Вопрос 258:
От: Ернар Шамбаев
Здравствуйте!
Скажите, пожалуйста, что означает сообщение об ошибке
"Index read only"? Она возникает у меня в приложении БД
"главный-подчиненный" при попытке добавить запись
в подчиненную таблицу.
Ответить.
Ответ 1:
Со своим вопросом от 29.04
(Скажите, пожалуйста, что означает сообщение об ошибке
"Index read only"? Она возникает у меня в приложении БД
"главный-подчиненный" при попытке добавить запись
в подчиненную таблицу) сам разобрался.
Оказывается, достаточно добавить подчиненной таблице
первичный индекс, а вторичный индекс этой же таблицы
сделать Maintained.
Вопрос 259:
От: Алексей Малиновский
Господа, подскажите как сделать форму типа формы Object Inspector с
функцией Stay on top?
Т.е. мне необходимо сделать висячую форму (примечание), которая бы
находилась на переднем плане, но фокус оставался бы главной формы...
Помогите пожалуйста, заранее спасибо.
С уважением, Алексей.
Ответить.
Ответ 1:
Вопрос 260:
От: Virus
Здравствуйте!
Как можно сделать "обрезание" формы по рисунку. То есть, я вставил на
форму рисунок (например кружок), и мне надо, что бы формы не было (что
бы она была, но только в форме кружка, то есть моего рисунка), а не
квадратная (обычная)?????? ЗАРАНИЕ БОЛЬШОЕ СПАСИБО!!!!!!
Ответить.
Ответ 1:
Вопрос 261:
От: Kolobaev Rodion
:Hi All
Кто знает как програмно создать таблицу (Paradox) через компонент TTable
и записать туда Password Security или добавить(удалить) пароль на
готовой таблице.
Kolobaev Rodion
Novokuznetsk
length@mail.ru <mailto:length@mail.ru>
Rodion@mail2000.ru <mailto:Rodion@mail2000.ru>
Ответить.
Ответ 1:
3. Отвеченные вопросы.
----------------------
Вопрос 81:
От: ION
Как вставить свой курсор из внешнего файла.
Ответить.
Ответ 1:
Используя процедуру LoadCursorFromFile
Ответ 2:
Вот так:
var
h:hcursor;
begin
h:=LoadCursorFromFile('D:\mc.cur');
Screen.Cursors[1]:=h;
Form1.Cursor:=1;
end;
Виталий.
Ответ 3:
Вот так:
..........................
var h : THandle;
begin
h := LoadImage(0, 'c:\Cursor.cur', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE OR
LR_LOADFROMFILE);
IF h = 0 THEN ShowMessage('Cursor not loaded!!!')
ELSE
Begin
Screen.Cursors[1] := h;
Form1.Cursor := 1;
End;
end;
....................................
Этот пример позволяет также использовать анимированные курсоры (*.ani)!
Ответ 4:
Вот кусок кода для загрузки анимированного курсора, который можно вставить в обработку события активизации формы :
var
h : THandle;
name: array[0..255] of char;
begin
StrPCopy(name,'Animcurs.ani');
h:=LoadImage(0,name,IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or
LR_LOADFROMFILE);
if h<>0 then
begin
Screen.Cursors[1]:=h;
Screen.Cursor:=1;
end else
Screen.Cursor:=crDefault;
end;
С уважением, Владимир Михайлович.
Вопрос 82:
От: Vmz
Уважаемые коллеги !
Не доводилось ли кому из STORED процедуры, прописанной в одной *.GDB
базы INTERBASE, обращаться к таблице, находящейся в другой *.GDB ?
С уважением, Владимир Михайлович.
Ответить.
Ответ 1:
Ты сможешь это сделать только если табличка будет ВНЕШНЯЯ, как для одной
базы, так и для другой.
Весь вопрос в том, адействительно ли это так необходимо?
Ответ 2:
Как говорит Дима Кузьменков (ib.demo.ru) такое невозможно.
Вопрос 83:
От: Мелитопольская РГА
подскажите пожалуйста как из Delphi установить расширение для
принтера (например принтер настроен на 180 dpi а нужно поставить 360). А
также можно ли программно узнать Серийный номер(метка, том) винчестера,
процессора компа.
Ответить.
Ответ 1:
Добрый день.
Psevdonm: array[1..DlPs] of string; //Кол-во псевдонимов
А остальное касается наличия конкретных путей(каталогов начиная от
текущего) для каждого псевдонима.
Psevdonm[3] := 'TERMNTNL,BASE\TNL'; //Сдесь TERMNTNL - имя псевдонима
//BASE\TNL - КАТАЛОГИ
//Это просто запись в журнал ошибки можно поставить MessageDlg
SaveTekJrn('ERR:Ошибка создания алиаса - '+wrstr);
Насчет принтера - это нужно читать доку по принтеру.
Ответ 2:
Узнать серийный номер винта можно так
function GetVolumeInfoFVS(const Dir:string;
var FileSystemName,VolumeName:string;var Serial:longint):boolean;
{Получение информации о диске
Dir - каталог или буква требуемого диска
FileSystemName - название файловой системы
VolumeName - метка диска
Serial - серийный номер диска
В случае ошибки функция возвращает false}
var
root:pchar;
res:longbool;
VolumeNameBuffer,FileSystemNameBuffer:pchar;
VolumeNameSize,FileSystemNameSize:DWord;
VolumeSerialNumber,MaximumComponentLength,FileSystemFlags:DWORD;
s:string;
n:integer;
begin
n:=pos(':',Dir);
if n>0 then s:=copy(Dir,1,n+1) else s:=s+':';
if s[length(s)]=':' then s:=s+'\'; root:=pchar(s);
getMem(VolumeNameBuffer,256);
getMem(FileSystemNameBuffer,256);
VolumeNameSize:=255;
FileSystemNameSize:=255;
res:=GetVolumeInformation(Root,VolumeNameBuffer,VolumeNameSize
,@VolumeSerialNumber, MaximumComponentLength, FileSystemFlags
,FileSystemNameBuffer,FileSystemNameSize);
Result:=res;
VolumeName:=VolumeNameBuffer;
FileSystemName:=FileSystemNameBuffer;
Serial:=VolumeSerialNumber;
freeMem(VolumeNameBuffer,256);
freeMem(FileSystemNameBuffer,256);
end;
Ответ 3:
{СЕРИЙНЫЙ НОМЕР ВИНЧЕСТЕРА}
function GetHDSerNo: shortstring; export;
var
VolumeName,
FileSystemName : array [0..MAX_PATH-1] of Char;
VolumeSerialNo : Cardinal;
MaxComponentLength,
FileSystemFlags : DWORD;
begin
try
GetVolumeInformation('C:\',VolumeName,MAX_PATH,@VolumeSerialNo,
MaxComponentLength,FileSystemFlags,
FileSystemName,MAX_PATH);
Result:=IntToHex(HiWord(VolumeSerialNo),4)+
'-'+IntToHex(LoWord(VolumeSerialNo),4);
except
;
end;
end;
С уважением, Владимир Михайлович.
Ответ 4:
серийный номер HDD
procedure TForm1.Button1Click(Sender: TObject);
var
VolumeName,FileSystemName : array [0..MAX_PATH-1] of Char;
VolumeSerialNo : DWord;MaxComponentLength, FileSystemFlags : Cardinal;
begin
GetVolumeInformation('C:\',VolumeName,MAX_PATH,@VolumeSerialNo,
MaxComponentLength,FileSystemFlags,FileSystemName,MAX_PATH);
Memo1.Lines.Add('VName = '+VolumeName);
Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));
Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));
Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));
Memo1.Lines.Add('FSName = '+FileSystemName);
end;
С уважением, SeRj
Вопрос 84:
От: Denis Kovaleff
Всем привет!
Очень прошу, киньте базовый проект для OpenGL-приложения. Самый минимум для
того, чтобы программа заработала. Например, как было в Pascal:
begin
end.
Или лучше так:
Program ex001;
Uses Crt;
Var s: string;
Begin
s:='Hello World!';
TextColor:=10;
WriteLn(s);
ReadLn
End.
Спасибо!
Денис.
Ответить.
Ответ 1:
Вот пример из дискеты, приложенной к книге
Краснов М.В.
OpenGL. Графика в проектах Delphi,
Санкт-Петербург, 2000
unit Unit1;
interface
uses
Windows, Messages, Forms, Dialogs, Classes, Controls, ExtCtrls, StdCtrls,
OpenGL;
type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
dc : HDC;
hrc: HGLRC;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{=======================================================================
Рисование окна}
procedure TForm1.FormPaint(Sender: TObject);
var
ps : TPaintStruct;
begin
BeginPaint (Panel1.Handle, ps); // для более устойчивой работы
wglMakeCurrent(dc, hrc);
glClearColor (1.0, 0.0, 0.0, 1.0);
glClear (GL_COLOR_BUFFER_BIT);
wglMakeCurrent(0, 0);
EndPaint (Panel1.Handle, ps);
end;
{=======================================================================
Формат пикселя }
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPIXELFORMATDESCRIPTOR;
nPixelFormat : Integer;
begin
FillChar(pfd, SizeOf(pfd), 0);
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
{=======================================================================
Начало работы приложения }
procedure TForm1.FormCreate(Sender: TObject);
begin
dc := GetDC (Panel1.Handle);
SetDCPixelFormat(dc);
hrc := wglCreateContext(dc);
end;
{=======================================================================
Конец работы приложения }
procedure TForm1.FormDestroy(Sender: TObject);
begin
wglDeleteContext(hrc);
end;
end.
Ответ 2:
На www.torry.ru в разделе графика есть два замечательных набора компонент (один называется GlScene) для
встраивания OpenGL в форму с хелпом и примерами. Разработка сцены в design-time!!! Сам пишу на Билдере, а
эти компоненты использую через dll написанные в Delphi - и замечательно получается.
Вопрос 85:
От: Denis Kovaleff
Здравствуйте!
Хочу использовать DirectX. Для этого, как узнал, нужен компонент
DelphiX. Подскажите, где его взять. Если у кого есть, скиньте на мыльцо
( dendyrec@pisem.net <mailto:dendyrec@pisem.net> ), а то выход в инет
только "почтовый".
Заранее благодарен.
DENdyRec
Ответить.
Ответ 1:
DelphiX можно загрузить с www.torry.ru по этой ссылке:
http://www.torry.net/vcl/packs/middle/hhdelphix.zip
Вопрос 86:
От: Sergey V. Alpatov
Hello ,
Friday, March 16, 2001, 9:25:57 AM, you wrote:
ДВТ> Добрый день.
>> Можно ли средствами Delphi создать полупрозрачную форму?
ДВТ> Полупрозрачную форму создать можно ;-))
ДВТ> Я бы мог расписать полностью алгоритм, но раз задаешь такой вопрос, то
ДВТ> вряд ли сможешь реализовать алгоритм. Поэтому поищи какой-нибудь
ДВТ> компонент - наверняка есть, например на www.torry.net
ДВТ> ICQ : 89533941
ДВТ> mailto:Dtarasov@kms.dvgd.ru (МПС-*.mps)
Здравствуйте!
Если у Вас есть код этого алгоритма, не могли бы Вы его переслать мне
(в остальном разберусь :-))))?
--
Best regards,
Sergey mailto:asv@fangorn.ryazan.ru
Ответить.
Ответ 1:
Окно полупрозрачным можно сделать в Windows 2000
SetWindowTransp(hndl: THandle; Perc: byte);
hndl - Hanle окна, которое надо сделать полупрозрачным.
Perc - число от 1 до 100, указывающее уровень прозрачности.
Вопрос 87:
От: Alexander Pleshakov
Привет.
Как в Delphi 5 отправлять e-mail, не юзая почтовый клиент (Outlook и
пр.)?
Заранее благодарен.
Александр Плешаков.
Ответить.
Ответ 1:
Вот простенький примерчик (без контроля ошибок) демонстрирующий отправку
почтового сообщения
сообщения с использованием компонента TNMSmtp;
Пример не отличается изяществом, но у меня работал без ошибок.
{Отправка уведомлений}
procedure TForm1.SendClick(Sender: TObject);
var Mysmtp: TNMsmtp;
begin
Mysmtp:=TNMsmtp.Create(nil);
Mysmtp.Host:='192.168.100.100'; {IP почтового сервера}
Mysmtp.Port:=25;
Mysmtp.Connect;
with Mysmtp do begin
Charset:='windows-1251';
PostMessage.FromAddress:='name@your.domen.ru'; {от кого}
PostMessage.ToAddress.Text:='name@your.domen.ru'; {для кого}
PostMessage.Body.Text:='Дата отправки: '+DateToStr(Date)+#10#13+
'Время отправки:
'+TimeToStr(Time);
SendMail;
end;
if Mysmtp.Connected then Mysmtp.Disconnect; Mysmtp.Destroy;
end;
Ответ 2:
Здравствуйте Александр!
В Делфи имеется целый набор компонент, упрощающих работу с Инетом.
"Прародителем" этих компонент является класс TPowersock.На базе потомков
этого класса созданы компоненты TNMSMTP amp& TNMPOP3. На палитре компонентов
располагаются они на закладке FastNet. В хелпе Делфи имеется описание их
основных методов и свойств, за исключением Exceptions :(. Так же в
дерриктории Demo в разделе FastNet примеры использования этих компонент, но
что бы они заработали необходимо подумать и поисправлять некоторые
неточности :-).
Компоненты давольно удачные, не зря же Borland выкупила на них лицензию и
включила с свой стандартный проект.
Ответ 3:
Используйте TNMSMTP
Uses NMsmtp;
type
TMainForm = class(TForm)
...
SMTP: TNMSMTP;
...
SMTP.PostMessage.FromAddress:=
SMTP.PostMessage.FromName:=
SMTP.PostMessage.ToAddress.Clear;
SMTP.PostMessage.ToCarbonCopy.clear;
SMTP.PostMessage.ToBlindCarbonCopy.clear;
SMTP.PostMessage.Body.clear;
SMTP.PostMessage.Attachments.clear;
SMTP.PostMessage.Subject:=:=setup.LocalProgram.text;
(*Mon, 27 Nov 2000 12:37:46 -0700*)
SMTP.PostMessage.ReplyTo:=
SMTP.PostMessage.ToAddress.text:=
SMTP.PostMessage.ToCarbonCopy.text:=
SMTP.PostMessage.ToBlindCarbonCopy.text:=
SMTP.PostMessage.FromAddress:=
SMTP.PostMessage.FromName:=
SMTP.PostMessage.LocalProgram:=
SMTP.PostMessage.ReplyTo:=
SMTP.SubType:=mtPlain;
SMTP.PostMessage.Body.Assign(temp);
SMTP.PostMessage.Attachments.add(File);
SMTP.SendMail;
Вопрос 88:
От: anton
Здраствуйте.
Скажите,я делаю прикол форматирования диска.Как мне написать процедуру
имитации форматирования диска?Чтобы звенел винт.И чтобы эта имитация была
связана с компонентом TGaude.
Антон.
Ответить.
Ответ 1:
Вопрос 89:
От: йЮКЮЬМХЙНБЮ хММЮ
Здравствуйте!
У меня вопрос насчет формирования отчетов при работе с Oracle. Сделать
просто запрос и по нему отчет QuickReport не удается, т.к. есть еще куча
вычислений и т.д. Удобно было бы записать результат этих преобразований
в таблицу, а уже по ней - отчет. Записывать каждую переменную в отчет не
хочется, хотя в моем случае возможен и такой вариант.
Вопросы:
1. Как создать таблицу Oracle в режиме выполнения программы, а потом ее
удалить?
2. Как вообще в таких случаях принято поступать?
Алина
Ответить.
Ответ 1:
Есть несколько вариантов.
Скажем, если это всё в Oracle делать. Можно создатть таблицу типа create table temp as select count(*) from table, а затем
её drop temp.
Можно в Делфях формировать таблицу Table:TTable, а потом её создать Table.CreateTable. Databasename=Oracle.
Можно локально создать таблицу типа DBF, в неё сохранить запрос и с ней потом работать. Мне кажется это будет проще
и быстрее.
Ответ 2:
Если отчеты достаточно однообразны, можно создать один раз в
базе данных хранимую процедуру, принимающую некоторые параметры
и возвращающую некий набор данных.
Отчет необходимо связать с компонентом TQuery (или любым другим
потомком TDataSet), и в теле запроса вызвать хранимую процедуру,
передав все необходимые параметры.
Вышеизложенные мысли являются моим субъективным взглядом на
проблемму дополнительных вычислений, и, следовательно, не являются
общепринятыми. Вообще, я считаю, что создавать для таких целей
новую таблицу было бы несколько накладно и теоретически неверно.
Вопрос 90:
От: Dimon
Вообщем есть проблема, пишу прогу которая должна на форме иметь в
конкретних
ситуациях различное число компонентов (Edit, Label), вообщем то будет
маленький RAD,
проблема в том что мне не известно конечное количество етих компонентов,
принцып
построения такой:
БД со свойствами + процедурка создания. Внимание вопрос :) :
Вообщем необходимо че нить вроде ARRAY которому можно присвоить объект и
потом
в етой процедуре обрващаться к компонентам по их индексу, из БД брать
свойства .......
З.Ы.: Ответы жду от тех кто енто пытался сделать, потому как в теории
создания мы и сами,
с усами.
delphiV
Ответить.
Ответ 1:
Дык, правильная мысль, создаешь ARRAY of <тип объекта>:
....................
Obj : ARRAY OF TLabel;
или
Obj : ARRAY[1..n] OF TLabel;
....................
Если число объектов известно(ARRAY[1..n]), то без проблем:
....................
Obj[x] := TLabel.Create(Self);
WITH Obj[x] DO Begin
Parent := <форма>
...
// Все необходимые действия с объектом
...
End;
...........................
Если же массив динамический, то:
..........................
var i : integer;
begin
SetLength( Obj, 1 );
i := 0;
Obj[i] := TLabel.Create(Self);
WITH Obj[x] DO Begin
Parent := <форма>
...
// Все необходимые действия с объектом
...
End;
...................
Далее при добавлении объектов в массив:
..................
Inc(i);
SetLength(Obj, i+1)
..................
Обращаться как с элементами массива:
.................
Obj[x].Caption := ...; // и т. п.
Nik
Ответ 2:
var p:array[1..10] of record
caption:string;
top:integer;
left:integer;
end;
var t:array[1..10] of TLabel;
i:integer;
for i:=0 to 10 do
begin
t[i]:=TLabel.create(nil);
t[i].parent:=Form1;
t[i].visible:=true;
t[i].top:=p[i].top;
t[i].left:=p[i].left;
t[i].caption:=p[i].caption;
end;
Вопрос 91:
От: Sergey V. Grekov
Уважаемые Господа.
Вопрос такого плана : при работе с таблицами FOXPro c
помощью компонента TQuery при удалении записей они
помечаются как удаленные но физически остаются в БД
В книге Шумакова ПВ написано что запись должна немедленно
удалиться из ТБД.Может кто подскажет как из приложения паковать таблицы?
Заранее благодарен.
Греков С
Ответить.
Ответ 1:
В библиотеке RX есть такая процедура PackTable().
Ей я и пользовался. Поставь себе компоненты и пользуйся.
Ответ 2:
-При работе с самим FoxPro eсть такая комманда pack.
-В БД ставится признак удаления, поэтому такие данные можно просто
откидывать
Ответ 3:
Упаковать таблицы FoxPro можно используя функцию DbiPackTable
Ответ 4:
Упаковка БД.
--начало--
with Table1 do
begin
if not (Active and Exclusive) then
raise EDatabaseError.Create('Таблицу надо откpыть эксклюзивно!');
try
Check(dbiPackTable(DBHandle, Handle, Nil, Nil, Regen));//Упаковка
finally
CursorPosChanged;
Refresh;
end;
end;
--конец--
Regen:boolean если надо перегенерировать индексы
С уважением, Semen
Ответ 5:
С FoxPro и TQuery не работал, но вообще-то для dBase в третьем Delphi использовал процедуру DbiPackTable из
модуля BDE и в help'е написано что для FoxPro она тоже действует.
У меня было так:
var hDb : hDBIDb;
Directory: String;
...
with Table1 do
begin
Active:=False;
Exclusive:=True;
Active:=True;
hDb:=DBHandle;
// Получение местонахождения (можно и напрямую указать или вообще сделать по другому)
SetLength(Directory, 250);
if DbiGetDirectory(DBHandle,True,PChar(Directory))<>0 then ;
SetLength(Directory, StrLen(PChar(Directory)));
Active:=False;
Directory:=Directory+'HozParS.dbf';
SetLength(Directory, StrLen(PChar(Directory)));
// Удаление с диска записей, помеченых в базе данных как удаленные
if DbiPackTable(hDb,Nil,PChar(Directory),szDBASE,True)<>0 then ;
Exclusive:=False;
Active:=True;
end;
Вопрос 92:
От: Dronny
У меня тут возникли проблемы с работой с MainMenu. Существует массив
строк, нужно его отобразить в виде подменю одного из пунктов меню
(MainMenu->Favorites->Files-><строки из массива>), при этом каждый
пункт должен иметь свойство onClick='MenuClick('+<имя пункта>+')'
для обработки клика.
Ответить.
Ответ 1:
Так как вы хотите, сделать скорее всего не получится. Но выход может быть
таким:
определить универсальное событие для всех пунктов в меню files. А при
выполнение этого события можно легко определить какой из пунктов был выбран.
Вот такой вот код это всё осуществляет:
в начале описываем Универсальное событие:
type
TForm1 = class(TForm)
......
procedure miClick(Sender: TObject);
........
private
{ Private declarations }
public
{ Public declarations }
end;
При нажатии на кнопку в меню Files (files - в моём коде это свойство name у
пункта в который нужно добавлять строчки) в меню Files добавляются строчки
из Form1.memo1:
procedure TForm1.Button1Click(Sender: TObject);
var
mi:TMenuItem;
num:integer;
c:TComponent;
begin
{если в этом муню уже есть пункты, то их все нужно удалить}
for num:=0 to files.Count-1 do
begin
c:=files.FindComponent('m'+IntToStr(num));
c.free;
end;
{Добавление пунктов}
for num:=0 to Form1.Memo1.Lines.Count-1 do
begin
Mi:=TMenuItem.Create(Files);
Mi.Name:='m'+IntToStr(num);
Mi.Caption:=Form1.Memo1.Lines[num];
mi.OnClick:=Form1.MiClick;
files.Add(mi);
end;
end;
само же событие выглядит примерно так:
procedure TForm1.miClick(Sender: TObject);
begin
ShowMessage((Sender as TMenuItem).name);
{что-то делаем с выбраным MenuItemом}
end;
Ответ 2:
Кусок из живой программы:
///////////////////////////
procedure TFormMenu.FormCreate(Sender: TObject);
var i:integer;
begin
try
DictClass.Open;
SetLength(Ami, DictClass.RecordCount);
for i:=0 to Pred(DictClass.RecordCount) do begin
Ami[i]:=TMenuItem.create(self);
Ami[i].name:='MI'+Trim(intToStr(i));
try
Ami[i].Caption:=DictClass['NAME'];
Ami[i].Tag:= DictClass['CLASSCODE'];
Ami[i].OnClick:=AmiClick;
MenuClassFiles.Add(Ami[i]);
except
//Перехват исключения в случае, если поле БД = null
end;
DictClass.Next;
end;
except
on E: Exception do showMessage(E.Message);
end;
end;
procedure TFormMenu.AmiClick(Sender: TObject);
var CurrTag:integer;
begin
CurrTag:=(sender as TComponent).tag;
//Действия в зависимости от CurrTag
end;
////////////////////////////////////////////
Здесь DictClass - таблица БД - наименования пунктов меню и
соответствующие им тэги;
Ami - вариантный массив;
MenuClassFiles - пункт меню, для которого создается подменю
Ответ 3:
--начало--
...
private
procedure ItemClick(Sender: TObject);
...
procedure TForm1.FormActivate(Sender: TObject); //Тут создаем список меню в подменю SubMenu
Var Item:TMenuItem;
i:Integer;
begin
for i:=1 to 5 do
begin
Item:=TMenuItem.Create(Self);
SubMenu.Add(Item);
Item.Caption:=IntToStr(i);
Item.OnClick:=ItemClick; //Назначаем общую процедуру клика по меню
end;
end;
procedure TForm1.ItemClick(Sender: TObject);
Var i:Integer;
begin
for i:=1 to SubMenu.Count do
if SubMenu.Items[i-1]=Sender then // Ищем нажатый пункт из всего списка
ShowMessage('Нажато '+SubMenu.Items[i-1].Caption); // А тут и сама обработка
end;
--конец--
С уважением, Semen
Вопрос 93:
От: Алексей Малиновский
Здраствуйте Господа!
Хочу сделать SCREEN SAVER, и мне необходимо анализировать параметр
командной строки при загрузке программы. Если параметр не задан, то
проргамма ничего не загружает и закрывается.
Я делаю так (в файле проекта):
Application.Initialize;
case ParamStr(1)[1] of
'S': Application.CreateForm(TFormMain, FormMain);
'A': Application.CreateForm(TFormParams, FormParams);
end; // case
Application.Run;
но если параметр не задан пограмма выдаёт ошибку, типа Access violation!
:-(
Программисты подскажите, что делать (как правильно организовать
стркуткуру программы)?
Заранее спасибо.
С уважением, Алексей.
Ответить.
Ответ 1:
В переменной ParamCount хранится число переданных программе параметров.
Ваш код должен выглядеть так:
if ParamCount > 0
then begin
// Сюда поместите Ваш код, анализирующий ParamStr(1)
end
else begin
// а здесь укажите, что делать если парамер не был введен.
// Это может быть, например, установка параметров по умолчанию
// или
// halt // если без введенных параметров программа вообще не должна
выполняться
end;
application.run;
Ответ 2:
// во-первых, вначале надо почитать ParamCount:
if (ParamCount = 1)
then
begin
Application.Initialize;
case ParamStr(1)[1] of
'S': Application.CreateForm(TFormMain, FormMain);
'A': Application.CreateForm(TFormParams, FormParams);
end; // case
// во-вторых, совсем без формы приложение не запустится и выдаст
// ошибку, то есть Run надо делать только если есть хотя бы одна форма
Application.Run;
end;
Ответ 3:
А если так?
Application.Initialize;
case ParamStr(1)[1] of
'S': begin
Application.CreateForm(TFormMain, FormMain);
Application.Run;
end;
'A': begin
Application.CreateForm(TFormParams, FormParams);
Application.Run;
end;
end; // case
Ответ 4:
Привет! Вот у меня так заработало:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.RES}
var
r:string;
c:char;
begin
Application.Initialize;
r:=ParamStr(1);
c:=#0;
if r<>'' then c:=r[1];
case c of
'S': Application.CreateForm(TForm1, Form1);
'A': Application.CreateForm(TForm2, Form2);
end;
Application.Run;
end.
Ошибка была в том, что если ничего в качестве параметров не передано, то
ParamStr(1)[1] не верно, так как длина ParamStr(1) равна 0.
Ответ 5:
В файле проекта:
Подредактируешь, если не устроит под себя :-)
begin
if (ParamCount > 0) and (UpperCase(ParamStr(1)) = '/S') then begin
{ScrnFrm должна быть главной формой.}
Application.CreateForm(TScrnFrm, ScrnFrm);
Application.CreateForm(TCfgFrm, CfgFrm);
end else begin
{CfgFrm должна быть главной формой.}
Application.CreateForm(TCfgFrm, CfgFrm);
Application.CreateForm(TScrnFrm, ScrnFrm);
end;
Application.Run;
end.
Если будет вылетать ошибка, для обеспечения показанной выше функциональности необходимо выключить
опцию "Complete boolean eval" в пункте меню Options | Project | Compiler settings. В противном случае при
отсутствии параметров командной строки будет возникать ошибка.
Для использования Delphi функции UpperCase(), необходимо включить модуль SysUtils в список используемых
модулей исходного кода проекта.
Вопрос 94:
От: "Кравец Станислав"
Здравствуйте! У меня вопрос: возможно ли блокировать Ctrl+Alt+Del в
WinNT?
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, 0, 0); работает только
под Win95/98.
Если знаете, ответьте скорее, пожалуйста, сроки поджимают. Заранее
благодарен.
Ответить.
Ответ 1:
Сам не пробовал, но основная идея такова - зацепить на Ctrl+Alt+Del
горячую клавишу и ничего по ней не делать:
KeyboardProc или SetWindowsHookEx из WinApi.
Ответ 2:
И правильно. CAD в WinNT слишком специфичная комбинация и до пользовательского приложения никогда не дойдет.
Если очень интересно - пиши свой logon в систему. GINA dll в win32 хелпе.
Вопрос 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
над компонентами
4. Ищу подельника.
------------------
Sam Savinov:
Ищу желающих принять участие в создании новой версии
криптографического пакета FET. С последней версией которого
можно ознакомиться по адресу: www.myportal.ru/ss
SAM / sam@myportal.ru
Astanin Dmitry:
Ищу желающих помочь мне в создании программы, обеспечивающей
одновременный доступ нескольких пользователей с
разных компьютеров в лок. сети (в этом я вообще чайник) и аудит
событий с сохранением результатов в защищенном
файле .. Дима kinch-ch@mail.ru
Лобастов Николай:
Здравстуйте, господа программисты.
У меня в голове куча идей, только не знаю куда с ними сунуться.
Два дня назад пришел к одному выводу и хочу с вами
поделиться. Может кто уже так делает. Может кто дельный совет даст.
Я работаю в банке в отделе разработки и столкнулся с тем, что мы часто
повторяемся в написании каких-то вещей.
Что такое хоз. деятельность любой организации? Это производство мат.
ценностей или услуг и ведение учета и отчетности. К чему сводится
отчетность? К документообороту. Что такое документ? Это объект с набором
свойств и методов. Никому не приходилось создавать компоненты TDocument,
TPlategka, TPKO, TRKO? Можно описать такие свойства как база данных, таблица,
номер, дата, название, методы такие как создать документ, провести документ,
распечатать документ и все это разместить на палитре компонент. И при
разработке чего-то еще нового в организации или в какой-то
фирме для организации просто кидаешь их на форму или в датамодуль
и описываешь реакцию на события.
Такая библиотека сильно облегчит автоматизацию предприятия, а разработчикам
поможет заработать кучу денег. Ведь это же златая кладезь.
Жду ответов и предложений. - Lobastov@kedr.kts.ru
Сильно похоже на рекламу, но ладно:
ProgramminG:
Проекту ProgramminG (http://programming.dax.ru) требуются люди для
совместного создания и администрирования сайта. От вас требуется
знание языка программирования delphi или любого другого.
Совместная работа заключается в ведении уроков, общении, решение проблем.
Ждем отзывов, предложений по адресу programming@dax.ru.
Если Вы хотите как можно скорее получить ответ на свой вопрос, то
укажите в теме письма - delphiV,иначе письмо будет прочитано значительно
позже, если же у вас есть предложения то в теме письма укажите delphiP.
Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.
За сим прощаюсь - скорых Вам и качественных программ.
Автор рассылки - Дмитрий.
ICQ - 89533941.
ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС
http://subscribe.ru/
E-mail: ask@subscribe.ru |
В избранное | ||