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

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


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

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

Выпуск № 692
от 27.12.2006, 12:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 414, Экспертов: 63
В номере:Вопросов: 6, Ответов: 16


Вопрос № 67979: Здравствуйте, уважаемые эксперты. Вопрос по преобразованию данных. Имеется переменная типа string, содержащая шестнадцатиричное представление числа, напр. '4F2A31'. Требуется найти число в десятичной системе счисления. У меня код получается не то...
Вопрос № 68040: доброго времени суток уважаемые эксперты всю ночь мучался над одной проблемкой в базе данных есть колонка дата (дд.мм.гггг) как осуществить поиск по дате если пользователь будет вводить только (дд.мм) год в данном случае неимеее...
Вопрос № 68044: доброго времени суток уважаемые эксперты у меня простенький вопрос но я в справочнике ненашел ответа если программа имеет 3-4 формы сначала загружается 2-я форма, 2-я уничножается открвается 1-я пользователь работает именно с 1 формо...
Вопрос № 68051: доброго времени суток уважаемые эксперты у меня такая проблема как создать DLL , как её подключить к пограмме и потом отключить если она ненужна все что я нашел в интернете это просто код но ведь переписывая чейто код и непонимая чт...
Вопрос № 68113: Как можно возводить число в любую степень и извлекать корень любой степени при помощи длинной арифметики?...
Вопрос № 68120: Здравствуйте, уважаемые эксперты. Снова вопрос по преобразованию данных. Слаб я в этом деле :) Итак: Имеется переменная TDateTime, в коей хранится Дата и Время события. Требуется записать в базу данных Access (использую ADO) в отдельное поле ...

Вопрос № 67.979
Здравствуйте, уважаемые эксперты. Вопрос по преобразованию данных.
Имеется переменная типа string, содержащая шестнадцатиричное представление числа, напр. '4F2A31'. Требуется найти число в десятичной системе счисления. У меня код получается не то что большой, а очень уж некрасивый. С функцией HexToBin так и не разобрался. Если можно использовать ее, то приведите пожалуйста пример ее использования.
PS. Строка может быть длиной до 20 символов (10 шестнадцатиричных чисел). Заранее спасибо.
Отправлен: 21.12.2006, 12:14
Вопрос задал: Шапель Алексей Михайлович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: PaVeL_Ekt
Здравствуйте, Щапель Алексей Михайлович!

вот, самое простое и менее затратное:

var m: integer;
...
m:=strtoint('$4f2a31'); //символ $ указывает что в строке hex код, без него еррор вылазит типа валуе нот интегер.
showmessage(inttostr(m));
---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: Студент)
Ответ отправлен: 21.12.2006, 12:25
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо, во-первых за оперативность, а, во-вторых, за оригинальную идею. Я бы не додумался до такого элементарного способа.

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Шапель Алексей Михайлович!
Привели бы ваш пример кода... непонятно, как и у вас требования.
Мой вариант в приложении.
Действительно, можно использовать символ '$' и применять StrToInt64

Приложение:

---------
Не узнаешь - не попробуешь.

Ответ отправил: Сухомлин Кирилл Владимирович (статус: Практикант)
Ответ отправлен: 21.12.2006, 12:58
Оценка за ответ: 5
Комментарий оценки:
Способ очень хорош для больших чисел. Огромное спасибо.

Отвечает: Gh0stik
Здравствуйте, Шапель Алексей Михайлович!

Вот предлагаю Вам на суд еще такой способ....


program Hex2Dec;

{$APPTYPE CONSOLE}

uses
SysUtils;

var i:integer;
rez:int64;
c16:string;
begin
write('HEX=',c16);read(c16);
rez:=0;
for i:=length(c16) downto 1 do
case ord(c16[i]) of
48..57: rez:=rez+round((ord(c16[i])-48)*exp((length(c16)-i)*ln(16)));
65..70: rez:=rez+round((ord(c16[i])-55)*exp((length(c16)-i)*ln(16)));
end;
write('BIN=',rez);
readln;
readln;
end.


Good Luck!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Практикант)
Ответ отправлен: 21.12.2006, 13:27


Вопрос № 68.040
доброго времени суток уважаемые эксперты
всю ночь мучался над одной проблемкой
в базе данных есть колонка дата (дд.мм.гггг)
как осуществить поиск по дате если пользователь будет вводить
только (дд.мм)
год в данном случае неимееет особого значения
главное чтобы из базы вытащили все что совпадает по (дд.мм)
обьясните пожалуста по подробней
что почему и как
заранее спасибо за ответ
Отправлен: 21.12.2006, 19:16
Вопрос задал: Fins (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Крылов Александр Владимирович
Здравствуйте, Fins!
Вам следовало указать СУБД, с которой Вы работаете, т.к. язык SQL различен для каждой СУБД, а также его возможности манипуляции данными

Возможно, мой вариант не самый оптимальный, но...
Идея такова, что дата из базы преобразовывается в строку и дальше уже сравнивать строки
Для преобразования в разных СУБД существую различные функции

CAST (<поле> AS <тип>),
TO_CHAR(<поле>, <формат>),
Форматы для функции TO_CHAR
'DD-Mon-YY'
'DD-Mon-YYYY'
'MM/DD/YY'
'MM/DD/YYYY
'DD.MM.YY'
'DD.MM.YYYY'
Пример
SELECT count(*) FROM db WHERE CAST(Birthdate AS char(10)) LIKE '26.12%'

или

SELECT count(*) FROM db WHERE TO_CHAR(Birthdate, 'DD.MM.YY') LIKE '26.12%'
Ответ отправил: Крылов Александр Владимирович (статус: 1-ый класс)
Ответ отправлен: 21.12.2006, 21:02

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

Попробуйте так

Select * from base
where
Date like ('10.12%')
---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: Студент)
Ответ отправлен: 22.12.2006, 08:14

Отвечает: Alex Van Glukhman
Здравствуйте, Fins!
Query1.Active:=false;
Query1.SQL.Text:='SELECT * FROM BD WHERE DATE LIKE :DATE';
Query1.Params.DataType:=ftString;
Query1.Params.Value:=Edit1.Text+'%'; //идёт по любому формату что ввели то и фильтруем
Query1.Active:=true;
Ответ отправил: Alex Van Glukhman (статус: 2-ой класс)
Ответ отправлен: 22.12.2006, 21:02


Вопрос № 68.044
доброго времени суток уважаемые эксперты
у меня простенький вопрос но я в справочнике ненашел ответа
если программа имеет 3-4 формы
сначала загружается 2-я форма, 2-я уничножается открвается 1-я
пользователь работает именно с 1 формой
3 и 4 форму не факт что вызовет
через меню project>options можно формы вытащить чтобы они незагружались все сразу
но при этом программа уже незапускается
что именно нужно прописать в project.dpr
чтобы это все работало и програма не грузила оперативную память
спасибо за ответ зарание
Отправлен: 21.12.2006, 19:35
Вопрос задал: Fins (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Крылов Александр Владимирович
Здравствуйте, Fins!
Вот пример, того как я это делал

После того как добавляется новая форма, эта форма создаётся при загрузке приложения
(в .dpr-файл добавляется Application.CreateForm(<класс формы>, <имя>) )
Процедуры создания всех форм кроме первой следует закомментировать, и прописать их в
обработчиках событий, которые вызывают соответствующие формы.

Пример.

Нажимаем на главной форме на кнопку, которая должна открыть другую форму FormEditStudent:
procedure TMainForm.Button1Click(Sender: TObject);
begin
Application.CreateForm(TFormEditStudent, FormEditStudent); // создаём форму
Self.Hide; // прячем главную
FormEditStudent.Show; // показываем форму
end;

Теперь нам нужно вернуться на главную форму из формы FormEditStudent:
procedure TFormEditStudent.BtnBackClick(Sender: TObject);
begin
Self.Hide; // прячем форму FormEditStudent
MainForm.Show; // Показываем главную форму
Self.Release; // уничтожаем FormEditStudent
end;
Ответ отправил: Крылов Александр Владимирович (статус: 1-ый класс)
Ответ отправлен: 21.12.2006, 20:16

Отвечает: KiberZero
Здравствуйте, Fins!

Прежде всего,после создания всех 4 форм,вам необходимо установить,какие формы будут создаваться автоматически,а какие будут доступными.В частности,в вашей задаче автоматически будет создаваться вторая форма,все остальные должны быть доступны.Для этого зайдите в опции проекта и перенесите Form1,Form3,Form4 в окно для доступных форм.После этого вам необходимо сделать соответствующие ссылки на модули форм.Для этого необходимо прописать ссылку в разделе uses.

Для первой формы:

var
Form1: TForm1;

implementation

uses Unit3, Unit4, Unit2;

{$R *.dfm}

Для второй формы:

var
Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

А далее пишем код для взаимодействия с процедурами форм.

Для первой формы:

procedure TForm1.FormCreate(Sender: TObject);
begin
Form2.Free;//удаляем из памяти
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TForm3,Form3); //создаём форму
Form3.Show; //делаем форму видимой
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Application.CreateForm(TForm4,Form4); //создаём форму
Form4.Show; //делаем форму видимой
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Application.CreateForm(TForm2,Form2); //создаём форму
Form2.Show; //делаем форму видимой
end;

end.

Для второй формы:

procedure TForm2.Button1Click(Sender: TObject);
begin
Application.CreateForm(TForm1,Form1); //создаём форму
Form1.Show; /делаем форму видимой

end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Form1.Free; //удаляем из памяти
end;

end.

А вот,чтобуде после этого прописано в Project1:

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3},
Unit4 in 'Unit4.pas' {Form4};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm2, Form2);
Application.Run;
end.

После этого будет всё работать,как вы хотели.

Удачи!
Ответ отправил: KiberZero (статус: 7-ой класс)
Ответ отправлен: 22.12.2006, 01:08

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

К ответам добавлю, что создавать формы возможно и таким методом

form2:=TForm2.Create(application);
form2.Show;

---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: Студент)
Ответ отправлен: 22.12.2006, 07:58


Вопрос № 68.051
доброго времени суток уважаемые эксперты
у меня такая проблема
как создать DLL , как её подключить к пограмме и потом отключить если она ненужна
все что я нашел в интернете это просто код
но ведь переписывая чейто код и непонимая что ты пишешь и для чего невозможно ничему научится
если вам нетрудно
напишите чтонибудь похожее или
укжите ссылочку на код с подробным обьяснением
заранее спасибо за ответ
прозьба неудивляйтесь моему вопросу я учусь сам и покачто еще новичек в таких делах
Отправлен: 21.12.2006, 20:13
Вопрос задал: Fins (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: monah
Здравствуйте, Fins!
В приложении пример, рабочий, но немного урезаный. По подключению к DLL
Сама же DLL создается с просто. В Delphi меню File/New/Other выбираете пункт DLL Wizard. Сохраняете проект. Обявляете там нужные функции. Обявить же функции экспортируемыми (доступными) можно перечислив их через запятую после ключевого слова exports перед структурой begin / end. в конце файла без параметров. примерно так
exports start, execut;

Приложение:

---------
festina lente

Ответ отправил: monah (статус: Студент)
Ответ отправлен: 21.12.2006, 20:44

Отвечает: Mo-skin
Здравствуйте, Fins!
Вот пример простейшей DLL.
В ней всего одна функция, она складывает два числа.

//=============== test.dll ==================
library test;

uses
SysUtils,
Classes;

{$R *.res}
function testfunc(a,b:integer):integer;
begin
result:=a+b;
end;

Exports
testfunc;

begin
end.
//===========================================

Вот пример ее статического подключения:
================ Unit1.pas =====================
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function testfunc(a,b:integer):integer; external 'test.dll' name 'testfunc';

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(testfunc(1,2)));
end;

end.

=====================================================

Динамическая загрузка:
Handle := LoadLibrary('libraryname');

Выгрузка:
FreeLibrary(Handle);

В делфийском хелпе поищите LoadLibrary.
Там есть хороший пример.
---------
Чем больше женщину мы меньше, тем больше меньше мы ее!
Ответ отправил: Mo-skin (статус: 3-ий класс)
Ответ отправлен: 22.12.2006, 00:15

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

К ответам хочу добавить, что длл это такой-же проект, только создается не EXE, а DLL, соответственно в длл можно запихивать формы, и делать все то, что и в обычном проекте.

Для подключения длл лучше использовать динамическую загрузку, по многим причинам:
если отсутствует ДЛЛ или произойдет какая-нибудь ошибка то программа продолжит работать, (при статическом, программа просто не запуститься)
Подключение по мере необходимости,

По динамической загрузке ответ полный и MONAH-а.

УДАЧИ
---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: Студент)
Ответ отправлен: 22.12.2006, 08:09


Вопрос № 68.113
Как можно возводить число в любую степень и извлекать корень любой степени при помощи длинной арифметики?
Отправлен: 22.12.2006, 09:52
Вопрос задал: Томша Павел (статус: 3-ий класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: KiberZero
Здравствуйте, Томша Павел!

Для возведения числа в любую степень используется функция Power(a,b)(a возвести в степень b) или X^Y = exp(ln(X) * Y) c некоторыми условиями (например, X не может быть нулем).Для извлечения корня используется функция Sqrt(x).

Например:

procedure TForm1.Button1Click(Sender: TObject);
var a:Real;
b:Real;
s:Extended;

begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
s:=Power(a,b);
Edit3.Text:=FloatToStr(s);
end;

Только незабудьте добавить в раздел uses Math.

Удачи!
Ответ отправил: KiberZero (статус: 7-ой класс)
Ответ отправлен: 22.12.2006, 15:52
Оценка за ответ: 3
Комментарий оценки:
Это я знаю, мне нужна работа с длиннными числами, которые ни один из типов держать не может!


Вопрос № 68.120
Здравствуйте, уважаемые эксперты. Снова вопрос по преобразованию данных. Слаб я в этом деле :) Итак:
Имеется переменная TDateTime, в коей хранится Дата и Время события.
Требуется записать в базу данных Access (использую ADO) в отдельное поле Дату, а в отдельное поле Время. С датой все получается DateToStr --> 'dd.mm.yyyy', а вот со временем получается TimeToStr --> '30.12.1899 h:mm:ss'. Что с этим можно сделать ?
Отправлен: 22.12.2006, 10:42
Вопрос задал: Шапель Алексей Михайлович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: PaVeL_Ekt
Здравствуйте, Шапель Алексей Михайлович!

TimeToStr(Time) должно нормально работать.
Возможно в бд поле стоит не типа Time, а типа DateTime
---------
Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: Студент)
Ответ отправлен: 22.12.2006, 11:23

Отвечает: KiberZero
Здравствуйте, Шапель Алексей Михайлович!

Ошибок не вижу, должно работать,возможно синтаксическая ошибка в коде,проверьте!

Вот пример:

procedure TForm1.Button1Click(Sender: TObject);
var c:TDateTime;
begin
c:=now;
Edit1.Text:=FloatToStr(c);
Edit2.Text:=DateTimeToStr(c); //показывает дату и время 22.12.2006 16:15:14
Edit3.Text:=TimeToStr(c); //показывает время 16:15:14
Edit4.Text:=FormatDateTime('dd.mm.yyyy tt',c); //показывает дату и время в формате
end;
Ответ отправил: KiberZero (статус: 7-ой класс)
Ответ отправлен: 22.12.2006, 16:21

Отвечает: Alex Van Glukhman
Здравствуйте, Шапель Алексей Михайлович!

Ошибка в БД в поле Время - внимательно проверьте тип поля попробуйте изменить его на строку и смотрите результат
Ответ отправил: Alex Van Glukhman (статус: 2-ой класс)
Ответ отправлен: 22.12.2006, 21:20


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.38 от 20.12.2006
Яндекс Rambler's Top100

В избранное