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

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 651
от 15.11.2006, 15:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 406, Экспертов: 67
В номере:Вопросов: 7, Ответов: 19


Вопрос № 61955: Ещё раз здравствуйте уважаемые эксперты! Хочу ещё раз поставить свой вопрос, но с подробным уточнением. Задача состоит в следующем: необходимо создать форму, в которой должны быть размещены -Edit1,Edit2,Button1,Button2 плюс для надписей использов...
Вопрос № 61960: Здраствуйте, Я рисую на канве что-либо процедурой в приложении. но когда начинаешь бысто водить мышкой, то рисуемая фигура получается разрывная. Как этого можно избежать?...
Вопрос № 61967: добрый день эксперты у меня такой вопрос : когда я создаю базу данных в ''.*db'' то умещается только 100 записией а чтобы составлять дальше то приходится создавать ещё один файл. как мне соединить сделать чтобы прога видела оба файла но работ...
Вопрос № 62019: Сколько занимает каждый элемент Tbits - 1 бит или 1 байт?...
Вопрос № 62033: Здраствуйте. Я выполняю какое либо действие в таймере с интревалом 300, например двигаю точку (см в приложении). Чтобы она быстрее двигалась нужно по логике уменьшить интервал. Уменьшаем: 200,100,10 разницы никакой. Как заставить точку двигаться быст...
Вопрос № 62043: Всем добого дня. У меня следующая задача - необходимо сделать DLL в которой будет некий класс (TMyObject = class...) . Так вот, вохникает вопрос использования концепции ООП и DLL. В том плане как мне в приложении, использующем этот DLL, реализов...
Вопрос № 62060: Здравствуйте! Как сделать в своей программе поддержку командной строки? Т.е. в командной строке пишешь имя своей проги, параметры, а она (прога) их выполняет? Заранее спасибо!...

Вопрос № 61.955
Ещё раз здравствуйте уважаемые эксперты! Хочу ещё раз поставить свой вопрос, но с подробным уточнением. Задача состоит в следующем:
необходимо создать форму, в которой должны быть размещены -Edit1,Edit2,Button1,Button2 плюс для надписей использовать Label1,2,3.В первый Edit вводится 1 число, во второй Edit - второе. По нажатию первой кнопки должен произойти ввод чисел, по нажатию второй - выход из программы. Посредством двойным нажатием левой кнопки мыши необходимо из первого числа вычесть второе.По чём должен быть двойной щелчёк кнопки, я сам не понял, так как это не оговаривается, я предположил, что двойное нажатие должно
выполняться внутри Edit1,так как далее в задаче поясняется,что нужноо найти событие для окна Edit1,которое позволит выполнить вычитание. Более того в задании указывается, что для решения этой задачи необходимо использовать одно из событий формы - onActivate или onCreat, я так и не понял, как его здесь применять. На последнем шаге задачи необходимо по нажатию кнопки ESC в окно Edit1 вернуть первоначальное число.

Я написал программу, но не всё так гладко.Вычитание происходит, но по нажатию кнопки ESC не происходит возвращение 1 числа в окно Edit1. И я так и не смог применить события onActivate или onCreat. И ещё, как можно при нажатии кнопки, вводить автоматически числа в окна Edit1,2?
Пожалуйста помогите!
За ранее благодарен!!!
Прикладываю листинг

Приложение:

Отправлен: 09.11.2006, 16:11
Вопрос задал: KiberZero (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Савенко Вадим Иванович
Здравствуйте, IskanderD!
Смотрите, разбирайтесь. Надеюсь, поможет решить проблему.

Приложение:

Ответ отправил: Савенко Вадим Иванович (статус: Студент)
Ответ отправлен: 09.11.2006, 16:59
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо!

Отвечает: Monah
Здравствуйте, IskanderD!
Добавлю
procedure TForm1.FormActivate(Sender: TObject);
begin
a:= 10;
b:= 5;
end;
---------
festina lente
Ответ отправил: Monah (статус: 8-ой класс)
Ответ отправлен: 10.11.2006, 06:20
Оценка за ответ: 5

Отвечает: PaVeL_Ekt
Здравствуйте, IskanderD!

Вот так должно работать!!!

Только не забудь событие у Edit-ов OnKeyDown прицепить к обработчику OnKeyDown формы !!!

Удачи !!!

P.S.
Пример я расписал специально, преподы (иль кто там) такое любят, но если хочеш можно код уменьшить !!!

Приложение:

---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL

Ответ отправил: PaVeL_Ekt (статус: 3-ий класс)
Ответ отправлен: 10.11.2006, 07:28
Оценка за ответ: 5


Вопрос № 61.960
Здраствуйте,
Я рисую на канве что-либо процедурой в приложении. но когда начинаешь бысто водить мышкой, то рисуемая фигура получается разрывная. Как этого можно избежать?

Приложение:

Отправлен: 09.11.2006, 17:34
Вопрос задал: Yujin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Юрий Викторович
Здравствуйте, Yujin!
Попробуйте использовать функцию lineTo вместо Rectangle
И уберите из процедуры
img.Canvas.Pen.Color:=rgb(255,0,0);
img.Canvas.Brush.Color:=rgb(255,0,0);
вынесите их куда-нибудь отдельно, чтобы не выполнять лишние действия, повысите производительность.
Ответ отправил: Юрий Викторович (статус: 1-ый класс)
Ответ отправлен: 09.11.2006, 18:49

Отвечает: PaVeL_Ekt
Здравствуйте, Yujin!

Я попробовал Ваш пример, у меня только точки рисовал в 2 пикселя:
Суть здесь такова
в глобальные переменные вводим
PX, PY: Integer;// Предыдущие координаты;
BX, BY: Integer;//Первичные координаты;
Ident: integer;//идентификатор фигуры присваеветься при нажатии на кнопку на панели инструментов (пример)

Ниже приведен рабочий код, просто надо доработать немного (затирает все, что нарисованно ниже);
Это можно сделать используя Stream, просто каждый раз при изменении рисунка перерисовывать canvas.

Приложение:

---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL

Ответ отправил: PaVeL_Ekt (статус: 3-ий класс)
Ответ отправлен: 10.11.2006, 07:40


Вопрос № 61.967
добрый день эксперты у меня такой вопрос :
когда я создаю базу данных в ''.*db'' то умещается только 100 записией а чтобы составлять дальше то приходится создавать ещё один файл.
как мне соединить сделать чтобы прога видела оба файла но работала как с одним
спасибо
Отправлен: 09.11.2006, 18:53
Вопрос задал: Hameleon (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: PaVeL_Ekt
Здравствуйте, Hameleon!

Из Вашего вопроса я вижу, что вы создаете БД, но вопрос почему .*DB (опечатка?)
насколько мне известно файл БД не имеет ограничения по количеству записей.

По возможности пришлите код программы, там и посмотрим в чем дело !!!
(можно на майл)
---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: 3-ий класс)
Ответ отправлен: 10.11.2006, 06:47


Вопрос № 62.019
Сколько занимает каждый элемент Tbits - 1 бит или 1 байт?
Отправлен: 10.11.2006, 01:44
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: sir henry
Здравствуйте, Blackie!
Узнать это просто. Свойство TBits.Bits[Index] возвращает тип Boolean. Какой размер занимает Boolean на Вашей машине?
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 10.11.2006, 04:04
Оценка за ответ: 5

Отвечает: PaVeL_Ekt
Здравствуйте, Blackie!

A Boolean variable occupies one byte of memory, a ByteBool variable also occupies one byte, a WordBool variable occupies two bytes (one word), and a LongBool variable occupies four bytes (two words).

, что означает Boolean, ByteBool - 1 байт, WordBool - 2 байта (слово), LongBool - 4 байта Двойное слово
---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: 3-ий класс)
Ответ отправлен: 10.11.2006, 06:54
Оценка за ответ: 5

Отвечает: Маренич Владимир
Здравствуйте, Blackie!
TBits - класс объявленный в модуле Classes. Если посмотрите на исходники, то можете увидеть, что там есть два поля
FBits: pointer - указатель на массив "битов"
и
FSize: integer - размер массива в битах
Глядя на методы этого класса можно с уверенностью сказать, что Ваши биты будут занимать не по одному байту, а по одномо биту. Но выделение памяти осуществляется кратно 32-м битам (4 байта). Т.е. если у Вас 10 бит, то В памяти будет выделено 4 байта памяти. Если 320 бит, то будет выделено 10 байтов памяти и т.д.
Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 12.11.2006, 00:47


Вопрос № 62.033
Здраствуйте. Я выполняю какое либо действие в таймере с интревалом 300, например двигаю точку (см в приложении). Чтобы она быстрее двигалась нужно по логике уменьшить интервал. Уменьшаем: 200,100,10 разницы никакой. Как заставить точку двигаться быстрей? Из-за чего так происходит?

Приложение:

Отправлен: 10.11.2006, 07:47
Вопрос задал: Yujin (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Monah
Здравствуйте, Yujin!
так происходит из за дискретности интервалов таймера. Фактически, два близких значения интервала не дадут вообще ни какой разницы. Если не ошибаюсь, дискретность равна 0,055 секунды.

Для обхождения этого используйте бесконечный цикл в котором будет стоять
sleep(10); задерка на 0,01 секунды.
application.procesmessage; обработка очереди сообщений
if application.terminated then exit; выход из цикла при закрытии приложения
---------
festina lente
Ответ отправил: Monah (статус: 8-ой класс)
Ответ отправлен: 10.11.2006, 08:08

Отвечает: PaVeL_Ekt
Здравствуйте, Yujin!

я пробовал Timer.Interval=1, также Sleep(1) толку не какого, но вот, что надумал
если при интервале таймера равном 1 увеличить шаг прохождения точки на 3, то она в 3 раза быстрее полетит !!! (см. пример)

Приложение:

---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL

Ответ отправил: PaVeL_Ekt (статус: 3-ий класс)
Ответ отправлен: 10.11.2006, 08:15

Отвечает: Melamed
Здравствуйте, Yujin!
Я бы на вашем месте восползовался мултимедийном таймером и рисование делал в отдельном потоке в цыкле. Модуль MMSystem нужен для API функций работы с мултимедийном таймером

Приложение:

Ответ отправил: Melamed (статус: 7-ой класс)
Ответ отправлен: 10.11.2006, 13:45


Вопрос № 62.043
Всем добого дня.
У меня следующая задача - необходимо сделать DLL в которой будет некий класс (TMyObject = class...) . Так вот, вохникает вопрос использования концепции ООП и DLL. В том плане как мне в приложении, использующем этот DLL, реализовать любое число объектов (var_1 : TMyObject; var_2 : TMyObject; и т.д. ... )?
P.S.
На сколько я понял DLL не экспортирует данные, а только лишь процедуры и функции, а следовательно ничего кроме методов для приложения не будет доступно. Поэтому выходит так, что одна DLL - один объект (его реализация) (для одного процесса)...
Отправлен: 10.11.2006, 09:43
Вопрос задал: Solodov Evgeniy Vladimirovich (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 12)

Отвечает: sir henry
Здравствуйте, Solodov Evgeniy Vladimirovich!
Вы правильно заметили, что DLL может экспортировать только процедурыфункции. Поэтому какие бы Вы объекты в своем DLL не объявляли, использовать их можно только внутри DLL.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 10.11.2006, 10:43
Оценка за ответ: 5
Комментарий оценки:
Спасибо что откликнулись. :) Жаль что Вы ничего мне не ответили...

Отвечает: Monah
Здравствуйте, Solodov Evgeniy Vladimirovich!
Несовсем так. DLL загружается в адресное пространство программы, поэтому можно создать в DLL функцию которая будет создавать объект класса и возвращать указатель на созданный него.
function(Name:PChar, Owner:TComponent):TMyClass;
примерно так.
Описание класса вынисете в отдельный модуль и прилинкуйте его и к программе и к DLL.
---------
festina lente
Ответ отправил: Monah (статус: 8-ой класс)
Ответ отправлен: 10.11.2006, 10:53
Оценка за ответ: 5
Комментарий оценки:
Я правилно Вас понял, что для моего случая в DLL следует помещать только методы, а все поля и свойства (описание объекта) должны быть в отдельном модуле?

Отвечает: Werewolf
Здравствуйте, Solodov Evgeniy Vladimirovich!
1)Задачу можно реализовать с помощью интерфейсов
пример
//UnitIntf.pas
unit UnitIntf;

interface
type
IMyObjectIntf = interface
['{D52BC24A-7E73-4F1E-88A9-AD01FC747272}']
procedure ShowMess;
end;

implementation

end.

2) сборке основной программы и dll c пакетом rtl

3)
Dll должна экспортировать функцию регистрации,
при вызове которой в главном приложении будет зарегистрирован нужный класс процедурой RegisterClass(TMyObject)
Пример:
//lib.dpr
library lib;

uses
UnitMyObject in 'UnitMyObject.pas',
UnitIntf in 'UnitIntf.pas';

exports Regist;
begin
end.

4) класс TMyObject должен быть наследником TPersistent а для поддержки интерфейсов TInterfacedPersistent
//UnitMyObject.pas
unit UnitMyObject;

interface
uses Classes, UnitIntf;
type
TMyObject = class(TInterfacedPersistent, IMyObjectIntf)
procedure ShowMess;
end;
function Regist: integer; stdcall; export;
implementation
uses windows;

procedure TMyObject.ShowMess;
begin
OutputDebugString('Привет');
end;

function Regist: integer;
begin
Classes.RegisterClass(TMyObject);
result := 0;
end;

end.
5. В главной программе должен быть подключен тот же модуль интерфейсов
Пример
//app.dpr
program app;

uses
Forms,
main in 'main.pas' {Form1},
UnitIntf in 'UnitIntf.pas';

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
6)вызываем регистрацию класса
ищем класс по имени
обявляется переменная типа TInterfacedPersistent и из неё берем нужный интерфейс
пример
//main.pas
unit main;

interface

uses
Forms;

type
TForm1 = class(TForm)
procedure FormActivate(Sender: TObject);
end;
var
Form1: TForm1;
function Regist: integer; external 'lib.dll' name 'Regist';
implementation

uses
UnitIntf, Classes, Sysutils;
type
TInterfacedPersistentClass = class of TInterfacedPersistent;
{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
var
cl: TInterfacedPersistentClass;
obj: TInterfacedPersistent;
iobj: IMyObjectIntf;
begin
Regist;
cl := TInterfacedPersistentClass(FindClass('TMyObject'));
obj := cl.Create;
iobj := obj as IMyObjectIntf;
iobj.ShowMess;
iobj := nil;
FreeAndNil(obj);
end;

end.
Ответ отправил: Werewolf (статус: Студент)
Ответ отправлен: 10.11.2006, 11:41
Оценка за ответ: 5
Комментарий оценки:
Спасибо за ответ. Попробую разобраться.:)

Отвечает: Маренич Владимир
Здравствуйте, Solodov Evgeniy Vladimirovich!
Может я не совсем правильно понял, но попробую помочь.
Действительно, организовать ООП не получиться, но кое-что можно состряпать. Для программы DLL-это "черный ящик с дырками". Т.е. Данные не доступны, но есть возможнось реализовать "подглядывание" с помощью експортируемых DLL-кой процедур (функций). И можно "наплодить" объектов сколько влезет. Напишу пример (в приложении).

Приложение:

Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 12.11.2006, 01:27
Оценка за ответ: 5
Комментарий оценки:
Спасибо, похоже это то что мне нужно. Хотя непонятно как тоже самое сделать с Pointer?


Вопрос № 62.060
Здравствуйте! Как сделать в своей программе поддержку командной строки? Т.е. в командной строке пишешь имя своей проги, параметры, а она (прога) их выполняет? Заранее спасибо!
Отправлен: 10.11.2006, 12:06
Вопрос задал: Neiroman (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: PaVeL_Ekt
Здравствуйте, Neiroman!

Просто, создаете проэкт, из него убираете все формы, прописываете в USES все модули которые вам понадобяться, в теле проэкта пишите функции и процедуры обработки.

ф-я для просмотра параметров: ParamStr(item)

ParamStr(0)-полный путь и имя фашего EXE - файла
Paramstr(1)-1 параметр.

ParamCount - ф-я показывающая сколько параметров было введено в командной строке.
---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: 3-ий класс)
Ответ отправлен: 10.11.2006, 12:25

Отвечает: Monah
Здравствуйте, Neiroman!
Все так только во первых все формы удалять не надо. Достаточно в модуле *.dpr или в onCreate главной формы проверить входные параметры. Но тут возможны подводные камни.
все параметры разделены пробелами. поэтому путь содержащий "Programm Files" будет разделен на два параметра по пробелу. Чтоб этого избежать складывайте параметры через пробел. см.приложение. В S остются только параметры разделенные пробелами.

Приложение:

---------
festina lente

Ответ отправил: Monah (статус: 8-ой класс)
Ответ отправлен: 10.11.2006, 12:37

Отвечает: Sattar
uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
var
FileName,Command:string;
i:integer;
begin
I:=pos('.exe',Edit1.Text);
FileName:=copy(Edit1.Text,1,I+4);
Command:=copy(Edit1.Text,I+4,Length(Edit1.Text));
ShellExecute(Handle,nil,PAnsiChar(FileName),PAnsiChar(Command),nil,SW_SHOW);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
for i:=1 To ParamCount do
Memo1.Lines.Add('Параметр '+ParamStr(i));
end;
Ответ отправил: Sattar (статус: 3-ий класс)
Ответ отправлен: 10.11.2006, 19:12


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное