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

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


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

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

Выпуск № 801
от 06.05.2007, 03:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 468, Экспертов: 93
В номере:Вопросов: 8, Ответов: 14


Вопрос № 84777: Добрый день, эксперты. Вопрос: кто знает, каким образом на Delphi реализовать защиту по типу как в AVELife TestGold Studio и EasyCHM v3.73. Эти программы при своем запуске просто убивают отладчики и дизассемблеры (пробовал DeDe, W32Dasm, OllyDbg ...
Вопрос № 84780: Здравствуйте! Помогите разобраться в Sql-запросе... У меня есть 2 таблицы Т1(TabN, NOrder,....) и Т5(TabN, NOrder,....), допустим в первой таблице 1 строка: TabN = 3, NOrder = 6, и во второй таблице 2-е строки: TabN = 4, NOrder = 7, TabN = 5, NOr...
Вопрос № 84796: Здравствуйте уважаемые эксперты!Помогите мне пожалуйста с кодом.Имеется StringGrid,в первой строке заголовки столбцов.Мне необходимо по клику на любом столбце добиться того,чтобы заключённые в нём значения сортировались (от меньшего к большему),соотв...
Вопрос № 84803: Подскажите пожалуйста, как в памяти найти процес ХХХ.exe, и потом в этом ХХХ.exe найти последовательность символов и вывести эту информацию...
Вопрос № 84834: Уважаемые эксперты. При проектировании шахмат, мне нужно к объекту TImage добавить свойство color. Как его правильно описать? И второй вопрос: У меня создается массив (8*8) из объектов TImage. Как можно определить с оздан объект или нет в данной ячейк...
Вопрос № 84843: Привет всем! Срочно нужна помощь! Короче, есть задача: найти сумму позитивных парных элементов в каждой строке квадратной матрицы А размером (n,n). Реализовать это все нужно в отдельном модуле. Я здесь немного начеркал, но в Delphi никак не могу пост...
Вопрос № 84884: Подскажите plz, как организовать масштабируемость окна....
Вопрос № 84888: Здравствуйте. Есть вопрос, который меня уже давно волнует. Как заставить Windows полностью перерисовать форму. Причем должны перерисовываться: - заголовок окна вместе с кнопками (закрыть, развернуть и свернуть); - бордюр формы (рамк...

Вопрос № 84.777
Добрый день, эксперты.
Вопрос: кто знает, каким образом на Delphi реализовать защиту по типу как в AVELife TestGold Studio и EasyCHM v3.73. Эти программы при своем запуске просто убивают отладчики и дизассемблеры (пробовал DeDe, W32Dasm, OllyDbg с плагином HideDebugger). Внешне это выглядит таким образом: при запуске проги из под дебагера и прога и дебагер закрываются без предупреждений, если просто запущен отладчик (или отладчики, запускал одновременно все перечисленное выше) и запускается прога, то дебагеры вырубаются, а прога спокойно работает дальше. Причем дебагер Delphi они не трогают.
Отправлен: 30.04.2007, 02:47
Вопрос задал: Trevol (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: DEEmoNz
Здравствуйте, Trevol!

Убиваем процесс по имени его exe'шника.

KillTask('ollydbg.exe');

//*-*-*-*-*

uses
Tlhelp32, Windows, SysUtils;

function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;

FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;

CloseHandle(FSnapshotHandle);
end;

Я проверял, работает.

Ответ отправил: DEEmoNz (статус: 1-ый класс)
Ответ отправлен: 01.05.2007, 03:54
Оценка за ответ: 3
Комментарий оценки:
Не то, если экзешник переименован (пр. ollydbg_kopi.exe), то тот же EasyCHM или EXECryptor все равно убивают этот процесс-ollydbg_kopi.exe. Рекомендую скачать тот же EasyCHM и поэкспериментировать с дебагером, эта защита очень любопытно устроена :)


Вопрос № 84.780
Здравствуйте! Помогите разобраться в Sql-запросе...
У меня есть 2 таблицы Т1(TabN, NOrder,....) и Т5(TabN, NOrder,....), допустим в первой таблице 1 строка: TabN = 3, NOrder = 6, и во второй таблице 2-е строки: TabN = 4, NOrder = 7, TabN = 5, NOrder = 9. Как построить Sql запрос так чтоб в результирующей таблице Result(TabN, NOrder) все выглядело так: где будут три строки (TabN = 3, NOrder = 6)
(TabN = 4, NOrder = 7)
(TabN = 5, NOrder = 9)
Это нужно для того чтобы отоброзить все приказы в журнале приказов где нумерация приказов будет происходить в пределах одного вида приказа, то есть в журнале у меня могут быть два одинаковых значения NOrder
Отправлен: 30.04.2007, 07:51
Вопрос задал: Митрофанов Дмитрий (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Esi
Здравствуйте, Митрофанов Дмитрий!
Для этого нужно создать временную или рабочую таблицу.
Перенести данные из одной и из другой таблицы в эту временную.
Составть запрос c учётом сортировки по полям TabN, Norder.
Ответ отправил: Esi (статус: 1-ый класс)
Ответ отправлен: 30.04.2007, 08:06

Отвечает: Крылов Александр Владимирович
Здравствуйте, Митрофанов Дмитрий!

Я так понял, что у вас никаких условий на выборку нет (раздела WHERE нет). Если это так, то запрос выглядит так.
SELECT * FROM T1
UNION
SELECT * FROM T5
Ответ отправил: Крылов Александр Владимирович (статус: 3-ий класс)
Ответ отправлен: 30.04.2007, 08:58

Отвечает: Denisss

Здравствуйте, Митрофанов Дмитрий!

Если мне не изменяет память, то это делается как-то так:
select T1.TabN, T1.NOrder, ... from T1, T5
where
  (T1.TabN = 3 and T5.TabN = 3 and T1.NOrder = 6 and T1.NOrder = 6)
  or (T1.TabN = 4 and T5.TabN = 4 and T1.NOrder = 7 and T1.NOrder = 7)
  or (T1.TabN = 5 and T5.TabN = 5 and T1.NOrder = 8 and T1.NOrder = 8)

Удачи!
Ответ отправил: Denisss (статус: Профессионал)
Россия, Москва
WWW: Хлама много, по сути ничего...
ICQ: 281599577
----
Ответ отправлен: 30.04.2007, 14:39


Вопрос № 84.796
Здравствуйте уважаемые эксперты!Помогите мне пожалуйста с кодом.Имеется StringGrid,в первой строке заголовки столбцов.Мне необходимо по клику на любом столбце добиться того,чтобы заключённые в нём значения сортировались (от меньшего к большему),соответственно и строки содержащие это значение сортировались бы тоже.
Отправлен: 30.04.2007, 10:37
Вопрос задал: GAZOT (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denisss
Здравствуйте, GAZOT!

Смотрите пример в приложении.
Код работает при отпускании кнопки мыши на первой (нулевой) строке StringGrid'a.

Удачи!

* Добавлены комментарии в приложение

Приложение:

Ответ отправил: Denisss (статус: Профессионал)
Россия, Москва
WWW: Хлама много, по сути ничего...
ICQ: 281599577
----
Ответ отправлен: 30.04.2007, 14:29
Оценка за ответ: 5
Комментарий оценки:
разобрался спасибо


Вопрос № 84.803
Подскажите пожалуйста, как в памяти найти процес ХХХ.exe, и потом в этом ХХХ.exe найти последовательность символов и вывести эту информацию
Отправлен: 30.04.2007, 11:43
Вопрос задал: Bee.line (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 11)

Отвечает: Denisss

Здравствуйте, Bee.line!

Сначала пропишите в uses модули TLHELP32, psapi, imageHlp.

Далее нужно перелистать все процессы и найти нужный Вам процесс. Затем определить размер занимаемой памяти (это я делаю путем листинга модулей процесса - первый модуль процесса является самим приложением). После всего этого производится побайтное чтение памяти процесса и сравнение с искомой строкой. (См. пример в приложении)

Приложение:

Ответ отправил: Denisss (статус: Профессионал)
Россия, Москва
WWW: Хлама много, по сути ничего...
ICQ: 281599577
----
Ответ отправлен: 30.04.2007, 13:26
Оценка за ответ: 4
Комментарий оценки:
Спасибо за совет, подскажите пожалуйста, почему нижеприведенный цикл (где идет сравнение) читает только первый символ процесса ХХХ.ЕХЕ
for i:= 0 to Pred(me32.modBaseSize) do begin
if ReadProcessMemory(hProc, Pointer(me32.modBaseAddr), @buff, 1, lpNumBRd) then begin
if (buff = 'k') then showmessage('найден символ');
form1.Memo1.Lines.Add(IntToStr(i)+' Сравниваем '+buff+' с К');
end;
end;


Вопрос № 84.834
Уважаемые эксперты. При проектировании шахмат, мне нужно к объекту TImage добавить свойство color. Как его правильно описать? И второй вопрос: У меня создается массив (8*8) из объектов TImage. Как можно определить создан объект или нет в данной ячейке.
Отправлен: 30.04.2007, 15:39
Вопрос задал: Култышев Владимир (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Denisss

Здравствуйте, Култышев Владимир!
Насчет свойства Color не совсем понятно. Т.е. Вы хотите установить BackGround? Можно, в этом случае, воспользоваться свойством Tag и хранить там код используемого цвета, а при отрисовке Image подсматривать этот код.

Не совсем понятно зачем Вы создаете массив 8х8. Я бы использовал TImageGrid, либо TPaintBox (ну или всего один TImage).

Чтобы проверить создан ли объект, пользуйтесь функцией Assigned. Пример:

  if Assigned(Images[1][1]) then
    ...



А вообще, лучше будет изначально создать все объекты (в Form.OnCreate), а потом удалить (в Form.OnClose).

Удачи!
Ответ отправил: Denisss (статус: Профессионал)
Россия, Москва
WWW: Хлама много, по сути ничего...
ICQ: 281599577
----
Ответ отправлен: 30.04.2007, 15:50

Отвечает: LEXASOFT
Здравствуйте, Култышев Владимир!

type
TMyImage = class(TImage)
MyColor: TColor;
end;
Ответ отправил: LEXASOFT (статус: 3-ий класс)
Ответ отправлен: 01.05.2007, 13:33

Отвечает: monah
Здравствуйте, Култышев Владимир!
У TImage есть свойство Color, но оно скрыто из секции public Нужно его просто переобьявить в этой секции как советует LEXASOFT. Проверить сушествование объекта можно сравнив его с значением nil.
if MyImeges[i,e]=nil THEN MyImeges[i,e]:=TMyImege.create(self);

---------
festina lente
Ответ отправил: monah (статус: Студент)
Ответ отправлен: 01.05.2007, 15:08


Вопрос № 84.843
Привет всем! Срочно нужна помощь! Короче, есть задача: найти сумму позитивных парных элементов в каждой строке квадратной матрицы А размером (n,n). Реализовать это все нужно в отдельном модуле. Я здесь немного начеркал, но в Delphi никак не могу поставить условие парности, пробовал и знак "/" и div, но ничего. И еще сумму каждой строки нужно закинуть в одномерный масив (я так думаю), поскольку потом мне нужно вывести эти суммы (я вывожу в Memo). Вот модуль:

Unit lab1;

Interface
var A:array[1..4,1..4] of integer;
B:array[1..4] of integer;
i,j,s:integer;

Procedure EnterMasiv;
Function Suma:integer;

Implementation

(*-------------------------------------
подпрограмма ввода матрицы
---------------------------------------*)
Procedure EnterMasiv;
var i,j:integer;
begin
randomize;
for i:=1 to 4 do
for j:=1 to 4 do
A[i,j]:=random(27)-10;
end;

(*----------------------------------------------------------------------------------------------
подпрограма нахождения суммы позитивных парных элементов в каждой строке
------------------------------------------------------------------------------------------------*)
Function Suma:integer;
var j:integer;
begin
s:=0;
for j:=1 to 4 do
begin
(*Здесь условие парности не работает*)
if (A[1,j]>0) and (A[1,j] / 2) then
s:=s+A[1,j];
(*А тут неправильно сохраняются суммы в массив*)
B[j]:=s;
end;
end;

end.

А вот основной модуль:

procedure TForm1.Button3Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
var j:integer;
begin
for j:=1 to 4 do
(*Результат выводиться, но не так как нужно*)
Memo2.Lines.Add('B[j]= '+inttostr(Suma));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
Memo2.Clear;
end;

procedure TForm1.Button4Click(Sender: TObject);
var i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
(*Вводятся почему-то только ноли*)
Memo1.Lines.Add(''+inttostr(A[i,j]));
end;

end.

Заранее большое спасибо!
Отправлен: 30.04.2007, 16:33
Вопрос задал: Eug (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denisss
Здравствуйте, Eug!

Скажу честно - я не совсем понимаю определение слова "парность". Но, если под этим имеется в виду "четность", то решение такое:

  (*Здесь условие парности не работает*)
  if (A[1,j]>0) and ((A[1,j] and 2) = 0) then

Здесь, четность проверяется по следующему принципу. Если число четное, то последний бит числа в двоичной записи 0, иначе - 1. После применения логической операции И элемента матрицы с числом 2, остается только последний бит числа, указывающий на его четность.

Удачи!
Ответ отправил: Denisss (статус: Профессионал)
Россия, Москва
WWW: Хлама много, по сути ничего...
ICQ: 281599577
----
Ответ отправлен: 30.04.2007, 16:54


Вопрос № 84.884
Подскажите plz, как организовать масштабируемость окна.
Отправлен: 30.04.2007, 22:38
Вопрос задал: Vovan_32 (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: DEEmoNz
Здравствуйте, Vovan_32!
Если я правильно понял, то это вам подойдет.

unit geScale;

interface
uses Forms, Controls;

procedure geAutoScale(MForm: TForm);

implementation
type
TFooClass = class(TControl); { необходимо выяснить защищенность }

{ свойства Font }

procedure geAutoScale(MForm: TForm);
const

cScreenWidth: integer = 800;
cScreenHeight: integer = 600;
cPixelsPerInch: integer = 96;
cFontHeight: integer = -11; {В режиме проектирование значение из Font.Height}

var

i: integer;

begin

{
ВАЖНО!! : Установите в Инспекторе Объектов свойство Scaled TForm в FALSE.

Следующая программа масштабирует форму так, чтобы она выглядела одинаково
внезависимости от размера экрана и пикселей на дюйм. Расположенный ниже
участок кода проверяет, отличается ли размер экрана во время выполнения
от размера во время проектирования. Если да, Scaled устанавливается в True
и компоненты снова масштабируются так, чтобы они выводились в той же
позиции экрана, что и во время проектирования.
}
if (Screen.width &; lt > cScreenWidth) or (Screen.PixelsPerInch <>
cPixelsPerInch) then
begin
MForm.scaled := TRUE;
MForm.height := MForm.height * screen.Height div cScreenHeight;
MForm.width := MForm.width * screen.width div cScreenWidth;
MForm.ScaleBy(screen.width, cScreenWidth);

end;

{
Этот код проверяет, отличается ли размер шрифта во времы выполнения от
размера во время проектирования. Если во время выполнения pixelsperinch
формы отличается от pixelsperinch во время проектирования, шрифты снова
масштабируются так, чтобы форма не отличалась от той, которая была во
время разработки. Масштабирование производится исходя из коэффициента,
получаемого путем деления значения font.height во время проектирования
на font.height во время выполнения. Font.size в этом случае работать не
будет, так как это может дать результат больший, чем текущие размеры
компонентов, при этом текст может оказаться за границами области компонента.
Например, форма создана при размерах экрана 800x600 с установленными
маленькими шрифтами, имеющими размер font.size = 8. Когда вы запускаете
в системе с 800x600 и большими шрифтами, font.size также будет равен 8,
но текст будет бОльшим чем при работе в системе с маленькими шрифтами.
Данное масштабирование позволяет иметь один и тот же размер шрифтов
при различных установках системы.
}

if (Screen.PixelsPerInch <> cPixelsPerInch) then
begin

for i := MForm.ControlCount - 1 downto 0 do
TFooClass(MForm.Controls[i]).Font.Height :=
(MForm.Font.Height div cFontHeight) *
TFooClass(MForm.Controls[i]).Font.Height;

end;

end;

end.

Ответ отправил: DEEmoNz (статус: 1-ый класс)
Ответ отправлен: 01.05.2007, 03:23


Вопрос № 84.888
Здравствуйте.
Есть вопрос, который меня уже давно волнует.
Как заставить Windows полностью перерисовать форму. Причем должны перерисовываться:
- заголовок окна вместе с кнопками (закрыть, развернуть и свернуть);
- бордюр формы (рамку);
- фон окна;
- и все контролы формы.
Наверняка есть какой-то нехитрый метод. Только одна просьба, не присылать ответы в виде: Form.Repaint, Form.Refresh, Form.Invalidate или Invalidate(Form, nil, true).
Отправлен: 30.04.2007, 23:11
Вопрос задал: Louken (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: DimonSoft
Здравствуйте, Louken!

Вопрос, конечно, интересный, т.к. ничего лучшего, чем приведённые Вами способы, посоветовать почти невозможно. Насколько мне подсказывает мой многолетний опыт работы (общения) с программистами различных уровней, Вы пытаетесь задать вопрос не по источнику проблемы, а по её последствию.

Что же... Как говорят на одном из форумов, "включаю свой телепатор"... Из Вашего необъяснённого желания избежать вышеперечисленных способов перерисовки я делаю вывод, что у Вас есть некоторая программа, которая во время работы по каким-то причинам не прорисовывает свою форму.

Теперь рассуждаем... Если Вы не хотите ответов наподобие Invalidate, Repaint, Refresh, значит Вы их уже пробовали и они не помогли. Так-с... Когда же такое может быть???

Даю 95%, что Ваша программа выполняет какие-либо действия, занимающие много времени и, скорее всего, в цикле.

В таком случае Вам следует знать, что во время выполнения процедуры с подобными вычислениями никакие сообщения от Windows (в том числе и WM_PAINT) окнами не обрабатываются, поэтому и форма не перерисовывается. Для того, чтобы избежать этой проблемы, следует вызвать метод Application.ProcessMessages. Причём вызов должен происходить прямо в цикле, т.е. при каждой итерации.

Приведу пример... Предположим, есть форма с Label'ом под именем CountLabel. И есть процедура, в которой на этом Label'е последовательно отображаются числа от 1 до 1000000000. Тогда для нормальной работы программы требуется приблизительно такой код этой процедуры...

procedure TYourForm.SomeProcedure(SomeParameters:TheirTypes);
var
i:Integer;
begin
for i:=1 to 1000000000 do
begin
CountLabel.Caption:=IntToStr(i);
Application.ProcessMessages;
{Delay(30);}
end;
end;

Delay - для наглядности, не более.

Надеюсь, это именно то, что Вам нужно.

P.S. <OffTop>Являясь разработчиком особой модели телепатора, я буду очень рад услышать о нём Ваше мнение. Если я ошибся в своих рассуждениях, укажите, где именно, - это будет способствовать развитию вышеназванного устройства.</OffTop> :)

С уважением, Оношко Дмитрий (DimonSoft).
Ответ отправил: DimonSoft (статус: 1-ый класс)
Ответ отправлен: 01.05.2007, 00:30

Отвечает: LEXASOFT
Здравствуйте, Louken!
Повтор предыдущего ответа
(Ерёмин А.)

Попробуйте Application.ProcessMessages
Ответ отправил: LEXASOFT (статус: 3-ий класс)
Ответ отправлен: 01.05.2007, 13:22

Отвечает: PGM
Здравствуйте, Louken!

Жаль, что вы не привели кода, который рисует на форме - это явно не использование Canvas формы, иначе вы не могли бы рисовать поверх контролов. И не DC окна - иначе вы бы не портили рамку и заголовок.

Исходя из этого, полагаю в вашем случае вероятно может помочь посылка окну формы пары сообщений - WM_PAINT (перерисовка содержимого) и WM_NCPAINT (перерисовка рамки). Обратите также внимание на сообщение WM_ERASEBKGND - если вы вдруг с ним работаете - оно отвечает за подложку при перерисовке.

Ответ отправил: PGM (статус: 6-ой класс)
Ответ отправлен: 02.05.2007, 10:51


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.52 (beta) от 02.05.2007
Яндекс Rambler's Top100

В избранное