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

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 46)


Программирование на DELPHI
Выпуск #46 (09 апреля 2006 г.) 

Разделы сайта:

Новости сайта
Система "Эксперт"
Вопросы и Ответы
Отправить вопрос
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Форум
F.A.Q.
Архив рассылки
Каталог сайтов
Обратная связь



Связь:

Администратор
Система "Эксперт"
Информация

Доброго времени суток, уважаемые читатели!

Вниманию всех зарегистрированных участников портала www.delphi.int.ru!

Объявляется набор экспертов для новой автоматизированной FAQ-системы. Попробовать себя в качестве эксперта могут все желающие. "Работа" эксперта заключается в отправке ответов на вопросы, которые будут задавать другие участники. Естественно, эксперты не обязаны отвечать на каждый заданный вопрос - дело исключительно добровольное и по возможности. Чтобы использовать возможности системы, Вы должны быть зарегистрированы на сайте (т.е. иметь учётную запись).

Для регистрации в качестве эксперта:
- Зарегистрируйтесь на сайте, если Вы ещё не сделали это;
- Отправьте письмо на адрес info@delphi.int.ru, в котором укажите зарегистрированный e-mail и первые 3 символа пароля (это необходимо для идентификации) с пометкой, что хотите зарегистрироваться в качестве эксперта.

Регистрация в качестве участника (посетителя), т.е. для того, чтобы задавать свои вопросы экспертам, предварительно не требуется. Участник должен лишь иметь зарегистрированную учётную запись и должен быть авторизирован на портале.

Регистрация экспертов проводится до 17 апреля. Если Вы до этого времени отвечали на вопросы в рассылке "Программирование на Delphi", то Вам автоматически будут добавлены имеющиеся баллы и кол-во отправленных ответов.

Что будет после 17 апреля? Ничего особенного. Любой участник по прежнему сможет включиться в состав экспертов, но при одном условии - кол-во отправленных этим экспертом ответов в рассылку зачислено не будет, т.е. счётчик отправленных ответов пойдёт с нуля. А вот заработанные баллы добавлены будут. Условие не очень существенное, но для тех, кто отвечал на вопросы в рассылке может сыграть важную роль - если при "старте" системы у эксперта кол-во отправленных ответов будет вполне определённым числом, то рейтинг этого эксперта изначально будет не в конце таблицы. Для экспертов, которые станут "новичками" кол-во ответов начнётся с нуля, но это можно быстро преодолеть и заметно увеличить свой рейтинг!

Зачисление кол-ва отправленных в рассылку ответов будет произведено в период с 9 по 13 апреля, а баллы участников будут начислены за 1-2 дня до открытия самой системы.

Открытие системы "Delphi.int.ru Expert" планируется на третью декаду апреля. Присоединяйтесь к составу экспертов прямо сейчас!

Разделы рассылки:

Авторское слово
Новые вопросы
Ответы на вопросы
Статья по Delphi
Файловый архив
Друзья
Юмор


Количество читателей рассылки: 5023.


Подписка на рассылку:

Программирование на DELPHI


Подписаться почтой

Лидеры по количеству баллов:

Итак, вот последняя таблица рейтингов...
Ждём всех Вас в составе экспертов новой системы
Delphi.int.ru Expert !
Ну а всем остальным, кто решат остаться простыми читатателями, хочу выразить благодарность за их труд!

Место
Имя
Баллы
Статус
1
Ermakova Dasha
344
Специалист
2
Dron
323
Специалист
3
Садовников Владимир
297
Практикант
4
Feniks
296
Практикант
5
Матвеев И.В.
290
Практикант
6
Iron Monk
200
Практикант
7
midav.land.ru
191
Практикант
8
Антон Трапезников
173
Практикант
9
PVS
167
Практикант
10
Лучников А.И.
140
Студент
11
Ершов Денис
135
Студент
12
mvp
134
Студент
13
Yurchik
110
Студент
14
VeroLom
90
Эксперт: 10-ый класс
15
Igor Danilevych
86
Эксперт: 9-ый класс
16
Деревянко Евгений
77
Эксперт: 8-ой класс
17
SHKoder@deagnostic.ru
74
Эксперт: 8-ой класс
18
Zeon
67
Эксперт: 7-ой класс
19
Антон
61
Эксперт: 7-ой класс
20
SiNiK
54
Эксперт: 6-ой класс
21
Константин Ситников
51
Эксперт: 6-ой класс
22
Павел Звягинцев
50
Эксперт: 6-ой класс
23
mfred
48
Эксперт: 5-ый класс
24
Вадим Фурив
46
Эксперт: 5-ый класс
25
Сергей Азачем
40
Эксперт: 5-ый класс

Некоторая статистическая информация (по системе "Эксперт"):

Статистика
На текущий момент
В прошлом выпуске
Динамика
Количество участников:
164
160
+4
Общее количество баллов:
5309
5210
+99
Средний балл:
32
33
-1
Максимальный балл:
344
329
+15
Минимальный балл:
3
3
-
Адресов в зоне .RU:
116
116
-


Основные правила нашей рассылки:

1. Не присылайте ответов на вопросы вроде "да я не знаю" или "да/нет". Такие ответы не публикуются.
2. Вопросы, не касающиеся Delphi, не принимаются (для этого существуют другие рассылки).
3. Запрещено присылать вложенные файлы, объёмом выше установленного ограничения (ограничения указаны в правилах).
4. Не изменяйте тем присылаемых писем. Письма с "неправильными" темами не обрабатываются! Используйте текстовый (не HTML) формат писем. HTML-теги применяйте только в том случае, если Вы уже достигли статуса, где это разрешено (см. правила).
5. Запрещено задавать вопросы, содержащие два (или несколько) вопросов разной тематики. Каждый из таких вопросов должен быть оформлен отдельным письмом.

Задать вопрос в рассылку    |    Задать вопрос с помощью web-формы    |   Система "Эксперт"

Данные ссылки недоступны. Вопросы, отправляемые с помощью web-формы обработке не подлежат.


Ответы на вопросы

Вопрос #279:
Создал в Delphi табличку, в которой есть поле с типом DATE. Как мне правильно осущесвить поиск по этому полю с помощью sql-запроса? Напишите пожайлуста пример.

1. [Отвечает: Лучников А.И. (статус: Студент), 08.04.2006 17:39]: Простоуказываядиапазоныпоиска:

select * from basename
where (date1 > "01.02.2002") and (date1<"01.04.2002")

Оценка за ответ: 5.

2. [Отвечает: Деревянко Евгений (статус: Эксперт: 8-ой класс), 08.04.2006 17:39]: Наиболее общим и удобным средством выбора набора данных по условию является использование параметров в запросах. Например, для стандартного TQuery это выглядит так:

SELECT * FROM Table1 WHERE DateField = :DateVal

Где DateVal является параметром (об этом говорит двоеточие перед названием). После того как этот запрос будет введён в свойство SQL, можно отредактировать тип и значение параметра в инспекторе объектов, свойство Params. В рантайме соответственно:

Query.Params[0].Value
либо
Query.ParamByName('DateVal')

Оценка за ответ: 5.

3. [Отвечает: Дмитрий Гордиенко (статус: Эксперт: 4-ый класс), 08.04.2006 17:39]: Точное совпадение одной или нескольких записей

select * from customer where LastInvoiceDate = '02.02.1995 1:05:03'

выборка значения в промежутке дат

select * from customer where LastInvoiceDate between '02.02.1995 1:05:03' and '02.03.1995 0:00:00'

Оценка за ответ: 5.

4. [Отвечает: PVS (статус: Практикант), 08.04.2006 17:39]: select * from mytable where datefield > '2006-02-01' - все записи после 1го февраля 2006 года. Хотя не мешало бы знать какая база данных используется.

Оценка за ответ: 5.

5. [Отвечает: Татьяна Щекочихина (статус: Эксперт: 1-ый класс), 03.04.2006 13:21]: Как вариант, предлагаю свое решение при помощи динамического запроса: например, есть таблица GRP, в которой есть поле INPUTDATE типа DATE. В форме в поле ввода компонента TDateTimePicker введена какая-то дата. Чтобы найти все строки таблицы с датой INPUTDATE равной введенному значению нужен примерно такой динамический запрос:

fmunit.IBDSetGRP.SelectSQL.add('select * from grp where inputdate=cast('''+datetostr(fmcasedate2.DateTimePicker1.Date)+''' as date)');

Оценка за ответ: 5.

6. [Отвечает: Ermakova Dasha (статус: Специалист), 08.04.2006 17:39]: Если поиск одной записи, то можно без запроса:

Query1.Locate('B3',EncodeDate(2001,1,1),[]);

Если нужно отфильтровать записи запросом, можно так:

Query1.SQL.Text:='select * from OneTable where DateField = :date';
Query1.ParamByName('date').AsDate:=EncodeDate(2001,1,1);
Query1.Active:=true;

Оценка за ответ: 5.

Вопрос #280:
Кто знает алгоритм рисования линии с заданными координатами начала и конца? Заранее спасибо.

1. [Отвечает: Лучников А.И. (статус: Студент), 08.04.2006 17:40]: Например на форме от точки (X1,Y1) до точки (X2,Y2);

with Form1.Canvas do
    begin
    Pen.Width:=3; // толшина 3 пикселя
    Pen.Color:=clRed; // ну пусть будет красной
    MoveTo(X1,Y1);
    LineTo(X2,Y2);
    end;

Оценка за ответ: 4.

2. [Отвечает: Алексей Давлетшин (статус: эксперт: 1-ый класс), 01.04.2006 15:02]: Очень простая формула (x-x0)/(x1-x0)=(y-y0)/(y1-y0), где х, у - это переменные, точка (х0, у0) - координаты начала прямой, (х1, у1) - координаты конца прямой. Выражаешь то что нужно.... и вставляешь в цикл и рисуется прямая:

for i:=x0 to x1 do
Image1.canvas.pixels[i,Round(((i-x0)*(y1-y0))/(x1-x0)+y0)]:=clblack
for i:=у0 to у1 do
Image1.canvas.pixels[Round(((i-y0)*(x1-x0))/(y1-y0)+x0),i]:=clblack

Оценка за ответ: 5 .

3. [Отвечает: LeVeL (статус: Эксперт: 4-ый класс), 08.04.2006 17:40]: В данном случае рисую на TpaintBox, но рисовать в принципе можно на чем угодно, лишь бы этот контрол имел Canvas.


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Этот пример рисует ломаную линию по 4 точкам
PaintBox1.Canvas.MoveTo(25,45); // устанавливаем точку, откуда будем рисовать
PaintBox1.Canvas.LineTo(56,67); //рисуем первый отрезок
PaintBox1.Canvas.LineTo(78,100); // продолжаем рисовать от конца первого отрезка
PaintBox1.Canvas.LineTo(100,56); // и так далее


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// также можно использовать и вот такую процедуру
// взято с http://www.swissdelphicenter.ch
procedure DrawLine(APoint1, APoint2: TPoint; ACanvas: TCanvas);
var
Lpixel, LMaxAxisLength: integer;
LRatio: Real;
begin
LMaxAxisLength := Max(abs(APoint1.X - APoint2.X), abs(APoint1.Y - APoint2.Y));
for Lpixel := 0 to LMaxAxisLength do
begin
LRatio := Lpixel / LMaxAxisLength;
ACanvas.Pixels[APoint1.X + Round((APoint2.X - APoint1.X) * LRatio),
APoint1.Y + Round((APoint2.Y - APoint1.Y) * LRatio)] :=
ACanvas.Pen.Color;
end;
end;


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Если необходима кривая Безье (сглаженные переходы), то могу порекомендовать модуль от andrus (далее его текст)

Здесь я использую процедуру рисования кривой Безье между двумя точками. Можно задать кривизну кривой(20-35 лучше всего). Можно задать число отрезков между соседними точками, а если в процедуре DrawSlice убрать коментарий со строки

// num_slices:=trunc(sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y)));

то число отрезков между соседними точками будет расчитываться автоматически, исходя из растояния между ними. Если потребуются дополнительные коментарии, пишите по адресу andrus78@mail.ru

unit u_bezier;

interface

uses Windows, Graphics, SysUtils;

type TArrayPoint = array of TPoint; //массив точек

const num_slices: integer = 20; //число отрезков между двумя точками
krivizna: integer = 30; //кривизна кривой (длина плеча направляющей)

procedure DrawBezier(acanv: TCanvas; var ArrPoint: TArrayPoint);

/////////////////////////////////////////////////////////////////////
implementation
uses unit1;

type
TBezierPoint = record //точка Безье
x, y: integer; //основной узел
xl, yl, //левая контрольная точка
xr, yr: single; //правая контрольная точка
end;
TArrayBezierPoint = array of TBezierPoint; //массив точек Безье

const grad_to_rad = pi / 180; //перевод градусов в радианы
rad_to_grad = 180 / pi; //перевод радиан в градусы
rad_90 = 90 * grad_to_rad; //90 градусов в радианах
rad_180 = 180 * grad_to_rad; //180 градусов в радианах
rad_270 = 270 * grad_to_rad; //270 градусов в радианах
rad_360 = 360 * grad_to_rad; //360 градусов в радианах

var Canvas: TCanvas; //рабочий холст, на котором происходит рисование


//определить угол в радианах между точкой и положительным направлением оси х

function GetAngle(dx, dy: single): single;
begin
if dx = 0 then begin
if dy = 0 then Result := 0
else if dy < 0 then Result := rad_270
else Result := rad_90;
exit
end;
Result := arctan(abs(dy) / abs(dx));
if dy < 0 then
if dx < 0 then Result := rad_180 + Result
else Result := rad_360 - Result
else
if dx < 0 then Result := rad_180 - Result
end;


//определить направляющие линии к точке p

procedure GetCooPerpendikular(a, o, b: TPoint; var p: TBezierPoint);
var alfa, beta, gamma, dx, dy, angle_napr: single;
l1, l2: single;
begin
dx := a.x - o.x; dy := a.y - o.y;
alfa := GetAngle(dx, dy);
l1 := sqrt(dx * dx + dy * dy) * (krivizna / 100); //растояние oa
dx := b.x - o.x; dy := b.y - o.y;
beta := GetAngle(dx, dy);
l2 := sqrt(dx * dx + dy * dy) * (krivizna / 100); //растояние ob
gamma := (alfa + beta) / 2; //биссектриса угла aob

if alfa > beta then angle_napr := gamma + rad_90
else angle_napr := gamma - rad_90;

p.xl := o.x + l1 * cos(angle_napr);
p.yl := o.y + l1 * sin(angle_napr);
p.xr := o.x + l2 * cos(angle_napr + rad_180);
p.yr := o.y + l2 * sin(angle_napr + rad_180)
end;


//вычислить координаты точки, лежащей на участке кривой между
//двумя точками Безье в пределах от 0 до 1

procedure BezierValue(P1, P2: TBezierPoint; t: single; var X, Y: integer);
var t_sq, t_cb, r1, r2, r3, r4: single;
begin
t_sq := t * t;
t_cb := t * t_sq;
r1 := (1 - 3 * t + 3 * t_sq - t_cb);
r2 := (3 * t - 6 * t_sq + 3 * t_cb);
r3 := (3 * t_sq - 3 * t_cb);
r4 := (t_cb);
X := round(r1 * p1.x + r2 * p1.xr + r3 * p2.xl + r4 * p2.x);
Y := round(r1 * p1.y + r2 * p1.yr + r3 * p2.yl + r4 * p2.y)
end;


//рисуй участок кривой между двумя точками Безье

procedure DrawSlice(p1, p2: TBezierPoint);
var i: integer;
x, y: integer;
r1, r2: TRect;
begin
// если убрать комментарий, то количество отрезков между соседними
// точками будет расчитываться исходя из растояния между ними
// num_slices:=trunc(sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y)));
Canvas.MoveTo(p1.x, p1.y);
for i := 1 to num_slices - 1 do begin
BezierValue(p1, p2, i / num_slices, x, y);
Canvas.LineTo(x, y)
end;
Canvas.LineTo(p2.x, p2.y)
end;


//рисуй кривую на холсте acanv по точкам массива ArrPoint

procedure DrawBezier(acanv: TCanvas; var ArrPoint: TArrayPoint);
var ArrBezPoint: TArrayBezierPoint;
i, num_point: integer;
a, o, b: TPoint;
begin
Canvas := acanv;
num_point := high(ArrPoint) + 1;
SetLength(ArrBezPoint, num_point);
for i := 0 to num_point - 1 do begin
ArrBezPoint[i].x := ArrPoint[i].x;
ArrBezPoint[i].y := ArrPoint[i].y;
end;
ArrBezPoint[0].xr := ArrPoint[0].x;
ArrBezPoint[0].yr := ArrPoint[0].y;
ArrBezPoint[0].xl := ArrPoint[0].x;
ArrBezPoint[0].yl := ArrPoint[0].y;
for i := 1 to num_point - 2 do begin
a := ArrPoint[i - 1];
o := ArrPoint[i];
b := ArrPoint[i + 1];
GetCooPerpendikular(a, o, b, ArrBezPoint[i])
end;
ArrBezPoint[num_point - 1].xr := ArrPoint[num_point - 1].x;
ArrBezPoint[num_point - 1].yr := ArrPoint[num_point - 1].y;
ArrBezPoint[num_point - 1].xl := ArrPoint[num_point - 1].x;
ArrBezPoint[num_point - 1].yl := ArrPoint[num_point - 1].y;

for i := 1 to num_point - 1 do
DrawSlice(ArrBezPoint[i - 1], ArrBezPoint[i])
end;

end.

// *********************************** //
// использовать этот модуль можно так: //
// *********************************** //

procedure TForm1.Button2Click(Sender: TObject);
var ArrPoint: TArrayPoint;
begin
SetLength(ArrPoint, 5);
ArrPoint[0].x := random(200); ArrPoint[0].y := random(200);
ArrPoint[1].x := random(200); ArrPoint[1].y := random(200);
ArrPoint[2].x := random(200); ArrPoint[2].y := random(200);
ArrPoint[3].x := random(200); ArrPoint[3].y := random(200);
ArrPoint[4].x := random(200); ArrPoint[4].y := random(200);

num_slices := 10;
krivizna := 30;
DrawBezier(Form1.Canvas, ArrPoint)
end;


// нужно не забыть включить модуль в список используемых:

// implementation
// uses u_bezier;

Оценка за ответ: 5.

4. [Отвечает: Дмитрий Гордиенко (статус: Эксперт: 4-ый класс), 08.04.2006 17:40]: В общем случае рисование любых графических примитивов производится на канве. Для примера нарисуем линию на канве формы. Для этого в событии onPaint напишем следующий код:

procedure TForm1.FormPaint(Sender: TObject);
begin
// установка цвета карандаша
Self.Canvas.Pen.Color := clRed;
// установка толщины карандаша
Self.Canvas.Pen.Width:= 2;
// передвигаем координаты начала рисования (начало линин)
Self.Canvas.MoveTo(150,150);
// рисуем линию до ее конечных координат
  Self.Canvas.LineTo(150,500);
end;

Более подробно советую прочитать здесь: http://www.codenet.ru/progr/delphi/stat/gdi.php

Оценка за ответ: 4.

5. [Отвечает: PVS (статус: Практикант), 08.04.2006 17:40]:

const
x1=...;
y1=...;

x2=...;
y2=...; {xi,yi - целые числа}

var
x,y,t,l,lx,ly:integer;

begin
lx:=x2-x1;
ly:=y2-y1;
l:=abs(lx);
if abs(ly)>abs(lx) then l:=abs(ly);
if l=0 then l:=1; {Если точки совпали - все равно нарисует!}
for t:=0 to l do begin
  x:=trunc(x1+t*lx/l);
  y:=trunc(y1+t*ly/l);
  ..............................
  ...Здесь рисуем точку (x,y)...
  ..............................
end;
end;

Оценка за ответ: 5.

6. [Отвечает: Матвеев И.В. (статус: Практикант), 08.04.2006 17:40]: Вот, обыкновенный алгоритм Брезенхема:

procedure Brezenhem(Point1, Point2: TPoint; Canvas: TCanvas);
var
  maxDelta : LongWord;
  i        : LongWord;
  Angle    : Real;
function Max(A,B: Integer): Integer;
begin
   if A > B then
     Result := A
   else
     Result := B;
end;
begin
// Выбираем максимальную дельту
maxDelta := Max( Abs(Point1.X - Point2.X), Abs(Point1.Y - Point2.Y) );
// Рисуем линию по инкременту
for i := 0 to maxDelta do
   begin
     Angle := i / maxDelta;
     Canvas.Pixels[Point1.X + Round((Point2.X - Point1.X) * Angle),
      Point1.Y + Round((Point2.Y - Point1.Y) * Angle)] := Canvas.Pen.Color;
  end;
end;

Оценка за ответ: 5.

7. [Отвечает: Ermakova Dasha (статус: Специалист), 03.04.2006 18:23]: Если координаты в пикселях, то не вижу проблем. А если в некой системе координат, то вот так можно с помощью PaintBox.

//Lb - левая координата
//Bb - нижняя координата
//X1, X2, Y1, Y2 - соответственно, координаты прямой
procedure TForm1.Button1Click(Sender: TObject);
var
ScaleX, ScaleY: real;
X1, X2, Y1, Y2, Lb, Bb, AWidth, AHeight: integer;
begin
X1:=-1;
X2:=3;
Y1:=-2;
Y2:=2;
Lb:=-3;
Bb:=-2;
AWidth:=PaintBox1.Width;
AHeight:=PaintBox1.Height;
ScaleX:=AWidth/6;
ScaleY:=AHeight/4;
  with PaintBox1.Canvas do
  begin
  MoveTo(Round((X1-Lb)*ScaleX),Round(AHeight-(Y1-Bb)*ScaleY));
  LineTo(Round((X2-Lb)*ScaleX),Round(AHeight-(Y2-Bb)*ScaleY));
  end;
end;

Оценка за ответ: 5.

8. [Отвечает: Косарев Антон Сергеевич (статус: Эксперт: 1-ый класс), 03.04.2006 2:28]: Года три назад делал программу для проверки монитора. Рисовал линии, вертикальные и горизонтальные. Возможно код пригодится.

procedure TForm1.Button1Click(Sender: TObject);
var x,y,px,py:integer;
begin
with Form1.Canvas do
begin
   x:=4000; // задаем конец координат
   y:=0; // -//-
   px:=0; // задаем начало координат
   py:=0; // -//-
   canvas.Pen.Color:=clred; // цвет линии
   canvas.MoveTo(px,py);  // переносим начало координат
   canvas.LineTo(x,y); // рисуем линию
    while py<100 do  // макс. высота получаемого "шлейфа"
     begin
     py:=py+10; // задаем отступы
     y:=y+10; // задаем отступы
     canvas.MoveTo(px,py); // перемещаем точку начала координат
     canvas.LineTo(x,y); // рисуем линию
     end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var x,y,px,py:integer;
begin
with Form1.Canvas do
begin
   x:=0;
   y:=4000;
   px:=0;
   py:=0;
   canvas.Pen.Color:=clwhite;
   canvas.MoveTo(px,py);
   canvas.LineTo(x,y);
    while px<4000 do
     begin
     px:=px+2;
     x:=x+2;
     canvas.MoveTo(px,py);
     canvas.LineTo(x,y);
     end;
end;
end;

Оценка за ответ: 5.

9. [Отвечает: bruder (статус: Эксперт: 1-ый класс), 02.04.2006 17:27]:

var poi: tpoint;
begin
{Устанавливаем начальные координаты.}
poi.X:=40;
poi.Y:=60;
form1.Canvas.PenPos:=poi;
{Конечные координаты и рисуем}
Form1.Canvas.LineTo(400,600);
end;

Оценка за ответ: 4.

Вопрос #281:
Есть ли возможность в DBGrid'e изменять высоту строк не всех сразу, в зависимости от содержимого одного поля (Мемо)? Например: первая строка - высотой 1, вторая - 2, третья - 1, четвертая - 4. Или подскажите какие компоненты это делают?

1. [Отвечает: LeVeL (статус: Эксперт: 4-ый класс), 08.04.2006 17:40]: Извините, но не знаю как сделать это с TDBGrid, но если не очень нужна функциональность с базой данных, то можно использовать и TStringGrid, так как он уже позволяет делать с собой, все что только может пожелать разработчик. К примеру, ответ на ваш вопрос.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if odd(ARow)  then
    StringGrid1.RowHeights[Arow]:= 24
  else
    StringGrid1.RowHeights[Arow]:= 16;
end;

Сколько не искал по TDBGrid, но только нашел как поменять высоту всех строк:

DBGrid1.DataSource.DataSet.DisableControls;
TStringGrid(DBGrid1).DefaultRowHeight := 55;
DBGrid1.DataSource.DataSet.EnableControls;

Оценка за ответ: 4.

2. [Отвечает: Ermakova Dasha (статус: Специалист), 03.04.2006 19:07]: Насколько я знаю, DBGrid не отображает содержимое Memo полей. Это можно сделать с помощью компонента DBCtrlGrid. На верхнем поле расставьте компоненты, которые будут отображать содержимое полей. Например, DBMemo, для Memo поля. В них нужно установить название отображаемого поля. В зависимости от настроек в гриде отобразится столько записей, сколько будет найстроено. Так можно показывать, например, поля, в которых содержатся картинки.

Оценка за ответ: 5.

Вопрос #282:
Здраствуйте, подскажите пожалуйста, как с помощью Delphi программно (во время выполнения) создать связь типа "один ко многим" между двумя таблицами Paradox 7?

1. [Отвечает: Деревянко Евгений (статус: Эксперт: 8-ой класс), 08.04.2006 18:20]: Как я понимю, здесь речь идет о связи Master/Detail. Если используются компоненты TTable, то главную таблицу надо подключить к DataSource:

MasterDataSource.DataSet := MasterTable;

а для подчиненной задать этот DataSource в свойстве MasterSource.

DetailTable.MasterSource := MasterDataSource;

Затем в подчиненной таблице задать свойства IndexFieldNames и MasterFields

IndexFieldNames := 'FieldNameFromDetailTable';
MasterFields := 'FieldNameFromMasterTable';

При использовании компонента TQuery:

MasterDataSource.DataSet := MasterQuery; // или MasterTable
DetailQuery.DataSource := MasterDataSource;
DetailQuery.SQL.Text := 'SELECT * FROM DetailTable WHERE
FieldNameFromDetailTable = :FieldNameFromMasterTable';

Двоеточие в запросе - не опечатка, а признак того,что 'FieldNameFromMasterTable' является полем из MasterTable.

Оценка за ответ: 5.

Вопрос #283:
Хочу сделать упаковщик исполняемых Файлов, помогите? И киньте пожалуйста статьи про PE файлы.

1. [Отвечает: LeVeL (статус: Эксперт: 4-ый класс), 08.04.2006 17:42]: Ну и вопрос у Вас, извините за наглость :-) , но потянете ли это, ведь для этого надо не просто знать как сжимать, но надо знать как и запустить раcпакованную программу из памяти, что не совсем легко.
Но вот пара ссылок для начала:

Простой упаковщик исполняемых файлов формата Win32 Portable Executable (PE). Также содержит элементы протектора: простая защита от отладки и полиморфный код (генератор мусорных инструкций) и т.д. http://sources.codenet.ru/file/710/exefog-1.1-sources.rar (Delphi)

А также, по теме:
Пример Joiner`а ( программа, скрепляющая два бинарника) на Delphi http://team-x.ru/filez/sources/delphi/hacking/joiner.zip

А вообще рекомендую на данную тему смотреть "родную" документацию от Microsoft, например MSDN (Microsoft Developers Network), можно найти на латках на дисках с Delphi, Visual Studio и т.д. Но одно НО эта документация только на английском.

Оценка за ответ: 5.

2. [Отвечает: bruder (статус: Эксперт: 1-ый класс), 02.04.2006 17:42]: Текст ответа: http://users.ae.ru/~aa/BOOKS/ASM/peformat.htm. С татья про формат PE. как и заказывал...

Оценка за ответ: 3.

3. [Отвечает: Матвеев И.В. (статус: Практикант), 08.04.2006 17:42]: Вам следует обратить внимание на упаковщик GHF Protector, он написан на Delphi и рапространяется с полными исходными текстами (смотрите приложение к письму), использует движок Morphine v2.6 и библиотеку сжатия AHPack v0.1.
Если имеются знания ассемблера (без этих знаний написать упаковщик Вам определенно не удастся) советую посмотреть исходники LameCrypt, PeX и т.д. (смотрите исходники в приожении к письму).
Есть еще один "корявый" вариант - он работает под WinXP, может быть работает под WinXP SP1 и точно не работает под WinXP SP2. Метод заключается в запуске стороннего процесса с помощью CreateInstal, а затем производится запись в виртуальную память процесса распакованного тела программы, после чего загрузчик завершается.
В этом методе используется недокументированная функция ZwUnmapViewOfSection и еще некоторые "нехорошие" приемы, поэтому он и не работает под SP.
Исходники примера этого метода (запуск EXE из ресурсов) смотрите в приложении к письму.

Загрузить прикреплённые файлы >>

Оценка за ответ: 5.

Все вопросы и ответы на них Вы всегда можете найти на нашем сайте в разделе "Delphi-Эксперт".


Статьи  >>

Новых статей пока что нет...

Любой из читателей может присылть свои статьи по адресу info@delphi.int.ru и они будут опубликованы в ближайших выпусках рассылки и на сайте. Статьи, полностью взятые с других сайтов, без указания ссылок на авторство, не публикуются.


Файловый архив  >>

Сегодня я хочу представить Вам программы, написанные нашим постоянным читателем LeVeL. Программы очень полезны и удобны в использовании.

Название
Описание
Категория
Объём
Ссылки
Folder2MyPC
С помощью этой утилиты Вы можете добавить в мой компьютер любые свои папки. Основные возможности:
- добавление / изменение / удаление любой папки в папку "Мой Компьютер",
- выбор типа создаваемого ярлыка: открываемого в том же окне Проводника или в новом,
- возможность выбора альтернативной иконки для папки,
- можно создавать папки как для текущего пользователя так и для всех пользователей в системе,
- не требуется загрузка программы для отображения новых папок, после их создания.
320 Кб
Folderico
Folderico позволяет изменять значок выбранной папки на любой выбранный. И даже при подключении жёсткого диска к другому компьютеру иконки останутся такими, какими их сделали Вы. Изменить иконку папки можно любым методом, который Вам наиболее удобен:
- через контекстное меню с предварительным просмотром изображения;
- через диалог, также с предварительным просмотром изображения.
Вы можете выбирать тему иконок в контекстном меню.
ВНИМАНИЕ: Перед установкой версии Folderico 3.0 удалите все предыдущие версии Folderico.
Теперь Folderico поддерживает специальные ini файлы локализации.
- Добавленные языки: русский, английский и французский.
934 Кб

Screenshots
Folder2MyPC 1.5.3 Screenshot
Folderico 3.0 Screenshot
Folder2MyPC 1.5.3
Folderico 3.0

Ссылки  >>

Здесь представлены ссылки на дружественные сайты. Обмен ссылками и баннерами приветствуется для сайтов схожей тематики. Здесь представлены самые последние ссылки:

All for Delphi - Научись правильно писать программы! Программы, компоненты, книги, ссылки.
Программирование на Visual Basic & Basic. Статьи, контролы, исходники, примеры, игры, ActiveX, форум по VB, а также многое другое на одном сайте!
http://xskernel.excode.ru/
Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source - наше направление.
http://infomania2004.webhost.ru/
Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, оставьте заявку на её поиск...
 
Рассылки Subscribe.Ru
Интернет для Delphi-программиста
Visual Basic для новичков и профессионалов
   
 

Юмор.

Вопрос в кроссворде:
- Язык програмирования из трех букв.
Ответ:
- c++

:))

Я здесь лежал, и здесь мои друзья
С таким похмельем долго жить нельзя
Средь глючных вИндов в пьяной тишине,
Какой-то юзер подпевает мне...

:))

"...а хуже всего приходится программистам из Microsoft. Им, бедолагам, в случае чего и обругать-то некого..."

:))

Начинается демонстрация нового компьютера, управляемого голосом. Изобретатель просит зал соблюдать тишину. Только он открывает рот - из зала крик:
- FORMAT C:!!! ENTER!!!

:))

Пропал исходный модуль, нашедшего просим вернуть отлаженным за приличное вознаграждение.

:))

Звонок в фирму.
- Здравствуйте. Вы продаете компьютеры?
- Вы что! Это филармония! (и уже спокойным голосом) А вам какие компьютеры нужны?..

:))

Здравствуйте !
Я новый полиморфный вирус-троян и распространяюсь по интернету.
Поскольку мой автор не умеет писать вирусов приносящих вред,
Вы должны мне помочь.
Сделайте пожалуйста следующее:
1. Сотрите у себя на диске каталог c:\windows и C:\Program files.
2. Отправьте это сообщение всем своим знакомым.
Заранее благодарен.

:))

Анекдоты прислал: Bruder.

Присылайте компьютерные анекдоты и истории по этой ссылке: info@delphi.int.ru и они обязательно будут опубликованы.

Товарищи программисты! Проявляйте свою активность. Давайте помогать друг другу! Если вы не нашли ответа на свой вопрос, не отчаивайтесь! Количество подписчиков постоянно растёт и, наверняка, найдётся тот человек, который поможет вам! До встречи через неделю!
Ведущий рассылки, Ерёмин Андрей.

В избранное