Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 4

Автор: Mandor Sawall
Дата сообщения: 18.04.2008 08:47
delover
А ето подходит?
Код: tv.Select(TreeViewItem, []);
Автор: delover
Дата сообщения: 18.04.2008 14:04
Mandor Sawall

Цитата:
А ето подходит?

Думаю нет ). А в качестве чего оно может подойти? Я сохраняю хэш (adler32+crc32) или id из базы всех нодов которые экспандед (развёрнуты) и тех которые имеют тот же хэш, сохраняю верхний узел и сохраняю выбранный. Когда я востанавливаю состояние дерева, то сначала востанавливаю развёрнутость, потом устанавливаю верхний, потом востанавливаю выбранный. Так например в случае если скопом добавилась куча файлов отчётов между верхним узлом и выбранным, то выбранный узел виден не будет. По этому важно делать node.makevisible, а он сдвигает скролл. tv.Select(... после MakeVisible не востановил скролл, а когда я верхний элемент назначил первым нодом, то выбранный узел не был виден.

А чем tv.Select(N, []) отличается от

if Assigned(N) then begin
N.Focused:=True;
N.Selected:=True;
//N.MakeVisible;
end;

я так и не понял. Надо как то запретить для MakeVisible горизонтальный скролл, либо скроллировать на начало после MakeVisible.
Автор: Mandor Sawall
Дата сообщения: 18.04.2008 15:05
delover
Я тоже не понимаю... У меня
N.Selected := True
двигает (только вертикально) скрол так, что бы нод был виден. MakeVisible делает хоризонтальной скрол так, что бы нод был всегда виден (например если хоризонтальное смещение нода больше чем ширина TreeView).

Иначе N.Selected работает прямо через TreeView_SelectItem, а tv.Select() делает еще немножко...
Автор: Czechoslovak
Дата сообщения: 18.04.2008 15:35
delover
Попробуй отключить горизонтальный скролл, потом включить
Автор: delover
Дата сообщения: 21.04.2008 12:49
Mandor Sawall

Цитата:
Я тоже не понимаю... У меня
N.Selected := True
двигает (только вертикально) скрол так, что бы нод был виден.

Ну если у Вас не стандартный компонент или comctl32.dll, то может быть такое поведение. Это не стандартно для деревьев. По умолчанию select ничего не двигает тем более если он обёрнут в BeginUpdate/EndUpdate и не установлена обция AutoExpand. Я раскопал всё таки как эти скролы двигать, но конечный код вышел ещё лучше. Я делаю MakeVisible только если его действительно не видно. В большинстве случаев это не так. Вот нормальный код со скролами и т.д.


Код:
if Assigned(T) then tv.TopItem:=T;
if Assigned(N) then begin
N.Focused:=True;
N.Selected:=True;
R1:=N.DisplayRect(False);
R2:=tv.ClientRect;
if (R1.Top < R2.Top) or (R1.Bottom > R2.Bottom) then
N.MakeVisible;
end;
J := GetScrollPos(tv.Handle, SB_HORZ);
if J <> 0 then begin
SetScrollPos(tv.Handle, SB_HORZ, 0, True);
SendMessage(tv.Handle, WM_HSCROLL, SB_ENDSCROLL, 0);
end;
finally
tv.Items.EndUpdate;
end;
Автор: AdminOrLooser
Дата сообщения: 21.04.2008 20:58
Привет, великие программеры!!! Подскажите пожалуйста, диплом горит!

В общем мне нужно сделать анимацию (Движение воды в песке с нефтью)

ДОПУСТИМ СЛЕВА НА ПРАВО Я СДЕЛАЛ

а еще нужно сделать с центра, т.е. нужно нарисовать случайные точки внитри круга (радиус будет расти), и круг ограничится прямоугольником...

procedure TForm1.Button6Click(Sender: TObject);

var sknn, skm:integer;
sknns:string;
begin
if m<-200 then form1.Timer1.Enabled:=false else begin
randomize;
for n:=1 to nn do begin
xx:=random(form1.Image1.ClientWidth-m) ;
yy:=random(form1.Image1.ClientHeight);
form1.Image1.Canvas.Pixels[xx,yy]:=clwhite;
end;
end;
nn:=(nn+5)+sknn;
m:=(m-4)-skm;
end;
Автор: ShIvADeSt
Дата сообщения: 22.04.2008 01:36
AdminOrLooser
Принадлежность точке кругу определяется по формуле
x^2+y^2<r^2 проверяй условие и рисуй точку. Какие проблемы
Автор: AdminOrLooser
Дата сообщения: 22.04.2008 07:09
Да нет! Мне нужно что-то типа:


xx:=random( ...КРУГ(ЦЕНТР,РАДИУС)... );
yy:=random( ...КРУГ(ЦЕНТР,РАДИУС)... );


Есть что-нить такое?

Добавлено:
кстати, такая штука прокатит? где хх и уу у меня координаты, а с - это шаг.
.....
x1:=array[form1.image1.clienWidth div 2 - c .. form1.image1.clienWidth div 2 + c] of integer;
y1:=array[form1.image1.ClientHeight div 2 - c .. form1.image1.ClientHeight div 2 + c] of integer;

....

xx:=random(x1);
yy:=random(y1);
form1.image1.canvas.pixels[xx,yy]:=clwhite;
Автор: MrZeRo
Дата сообщения: 22.04.2008 09:40
AdminOrLooser
прокатит так:

Цитата:

var
x1 : array of Integer;
...
begin
...
SetLength(x1, my_size)
...


А по поводу случайных точек внутри круга, можно брать отдельно
xx := ЦЕНТР(x)-radius+random(2*(radius-delta))
yy := ЦЕНТР(y)-radius+random(2*(radius-delta))
delta - это чтобы внутренний круг не выходил за рамки большого.
Автор: megamozg13
Дата сообщения: 22.04.2008 11:58
Приветствую. Наша бух.программа не поддерживает использование глоб.переменных. посему мне нужно написать ддл'ку для хранения массивов данных.

[more]

library arrays;
uses Windows,Messages,SysUtils,Controls,ShellApi,Classes;
var
ar_kolvo: Integer;
ar_indx: array of PChar;
ar_data: array of PChar;

//\\ ОЧИСТКА МАССИВОВ /\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
procedure ArrayClear(Wnd: HWnd; var_index,var_data: PChar); stdcall;
begin
ar_kolvo:=0; FreeMem(ar_indx); FreeMem(ar_data);
end;
exports ArrayClear;

//\\ СОХРАНЕНИЕ /\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
procedure ArraySet(Wnd: HWnd; var_index,var_data: PChar); stdcall;
var
ar_tek, i: Integer;
begin
// попытка найти номер по порядку
ar_tek:=0;
if ar_kolvo>0 then
for i:=1 to ar_kolvo do
if StrComp(ar_indx[i],var_index)=0 then ar_tek:=i;

// сохранение
if ar_tek=0 then ar_tek:=1;
StrCopy(ar_indx[ar_tek], var_index);
StrCopy(ar_data[ar_tek], var_index);
end;
exports ArraySet;

//\\ СЧИТЫВАНИЕ /\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
procedure ArrayGet(Wnd: HWnd; var_index,var_data: PChar); stdcall;
var
ar_tek, i: Integer;
begin
// попытка найти номер по порядку
ar_tek:=0;
if ar_kolvo>0 then
for i:=1 to ar_kolvo do
if StrComp(ar_indx[i],var_index)=0 then ar_tek:=i;
// считывание
if ar_tek<>0 then StrCopy(var_index,ar_data[ar_tek]);
end;
exports ArrayGet;

//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
end.

[/more]

косячит во время выполнения, посдкажите в чем я туту неправ...
Автор: MrZeRo
Дата сообщения: 22.04.2008 12:19
megamozg13
Что-то нигде не видно выделения памяти под массивы.
Почитай внимательно в хелпе раздел "Dynamic Arrays", раз ты их хочешь использовать.
Можно посоветоватьдля начала протестировать без Dll, для простоты, чтобы можно было отлаживать.
Странный какой-то код.
Автор: Maks150988
Дата сообщения: 22.04.2008 12:32
Здраствуйте. Есть компонет для спектрума для басс.длл. Так вот он через VCL на канвасе рисует. Но инициализируется в примере на пэйнтбоксе. Так вот можно ли заставить рисоваться его на статике в обычном диалоге? И если да, то кто может помочь? А то я быстренько бросил эту затею, потому как с первого раза не получилось. И непонятно еще что через таймер обновляется, а надо ли в WM_PAINT что-нибудь указывать. Вообщем, кто может помочь? Код напишу сюда если что.
Автор: megamozg13
Дата сообщения: 22.04.2008 12:53
MrZeRo
перекрутил вот так, но все равно косячит при выполнении:

[more]
library arrays;
uses ShareMem,Windows,Messages,SysUtils,Controls,ShellApi,Classes;
var
ar_kolvo: Integer;
ar_indx: array[0..500] of PChar;
ar_data: array[0..500] of PChar;

//\\ ОЧИСТКА МАССИВОВ /\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
procedure ArrayClear(Wnd: HWnd; var_index,var_data: PChar); stdcall;
var
i: Integer;
begin
for i:=0 to ar_kolvo do begin ar_indx[i]:=nil; ar_data[i]:=nil; end;
ar_kolvo:=0;
end;
exports ArrayClear;

//\\ СОХРАНЕНИЕ /\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
procedure ArraySet(Wnd: HWnd; var_index,var_data: PChar); stdcall;
var
ar_tek, i: Integer;
begin
// попытка найти номер по порядку
ar_tek:=0;
if ar_kolvo>0 then
for i:=0 to ar_kolvo do
if StrComp(ar_indx[i],var_index)=0 then ar_tek:=i;

// сохранение
if ar_tek=0 then
begin ar_kolvo:=ar_kolvo+1; ar_tek:=ar_kolvo; end;

StrCopy(ar_indx[ar_tek], var_index);
StrCopy(ar_data[ar_tek], var_data);
end;
exports ArraySet;

//\\ СЧИТЫВАНИЕ /\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
procedure ArrayGet(Wnd: HWnd; var_index,var_data: PChar); stdcall;
var
ar_tek, i: Integer;
begin
// попытка найти номер по порядку
ar_tek:=0;
if ar_kolvo>0 then
for i:=0 to ar_kolvo do
if StrComp(ar_indx[i],var_index)=0 then ar_tek:=i;
// считывание
if ar_tek<>0 then StrCopy(var_data,ar_data[ar_tek]);
end;
exports ArrayGet;

//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
begin
end.
[/more]

а код конечно странный будет, я дельфи поставил час назад =) до этого не писав на дельфях ниразу
Автор: MrZeRo
Дата сообщения: 22.04.2008 13:10
megamozg13
Ну так принципиально ничего не поменялось.
Еще раз: где выделение памяти под массивы?
StrCopy память не выделяет:

Цитата:

Use StrCopy to copy Source to Dest. StrCopy returns Dest.
StrCpy does not perform any length checking. The destination buffer must have room for at least StrLen (Source)+1 characters.

Посмотри все-таки хоть какие-нибудь примеры работы с динамическими массивами, раз справку читать не хочешь.
Методом тыка тут не пройдет, имхо.
Вот загляни сюда: hггp : // www. drkb. ru/, гуглом пошарь на тему "delphi dynamic arrays"
Автор: megamozg13
Дата сообщения: 22.04.2008 13:23
MrZeRo
поправил, теперь косячит на методе "чтение" ("сброс" и "запись" проходят вроде как без ошибок)
[more]
library arrays;
uses ShareMem,Windows,Messages,SysUtils,Controls,ShellApi,Classes;
var
ar_kolvo: Integer;
ar_indx: array[1..500] of PChar;
ar_data: array[1..500] of PChar;

//\\ ОЧИСТКА МАССИВОВ /\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
procedure ArrayClear(Wnd: HWnd; var_index,var_data: PChar); stdcall;
var
i: Integer;
begin
for i:=0 to ar_kolvo do begin ar_indx[i]:=nil; ar_data[i]:=nil; end;
ar_kolvo:=0;
end;
exports ArrayClear;

//\\ СОХРАНЕНИЕ /\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
procedure ArraySet(Wnd: HWnd; var_index,var_data: PChar); stdcall;
var
ar_tek, i: Integer;
begin
// попытка найти номер по порядку
ar_tek:=0;
if ar_kolvo>0 then
for i:=0 to ar_kolvo do
if StrComp(ar_indx[i],var_index)=0 then ar_tek:=i;

// выделение памяти и наращивание счетчика кол-ва элементов
if ar_tek=0 then
begin
ar_kolvo:=ar_kolvo+1; ar_tek:=ar_kolvo;
GetMem(ar_indx[ar_tek],Length(var_index)+1);
GetMem(ar_data[ar_tek],Length(var_data)+1);
end;
// сохранение
StrCopy(ar_indx[ar_tek], var_index);
StrCopy(ar_data[ar_tek], var_data);
end;
exports ArraySet;

//\\ СЧИТЫВАНИЕ /\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
procedure ArrayGet(Wnd: HWnd; var_index,var_data: PChar); stdcall;
var
ar_tek, i: Integer;
begin
// попытка найти номер по порядку
ar_tek:=0;
if ar_kolvo>0 then
for i:=0 to ar_kolvo do
if StrComp(ar_indx[i],var_index)=0 then ar_tek:=i;
// считывание
if ar_tek<>0 then
begin
GetMem(var_data,Length(ar_data[ar_tek])+1);
StrCopy(var_data,ar_data[ar_tek]);
end;
end;
exports ArrayGet;

//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
begin
end.
[/more]
думаю тут последняя блоха осталась, вот где тока.
drkb.ru - ща буду лопатить
обана, 30 мегов статей это мощно, качаю... спасибо за ссылку на ресурс.
Автор: MrZeRo
Дата сообщения: 22.04.2008 14:12
megamozg13
А зачем при считывании-то выделять память?
По идее считывание предполагает, что где-то в памяти записаны нужные данные и их оттуда надо извлечь.
И куда-то исчезли операторы освобождения памяти. Т.е. память всё выделяется и выделяется, а освобождаться не будет никогда?
Присвоение указателю значения nil память не освобождает.
Кроме того, в коде есть еще кое-какие ошибки, сам увидишь потом.
Например, ты не стесняешься писать

Цитата:

for i:=0 to
ar_kolvo do
if StrComp(ar_indx[i],var_index)=0 then ar_tek:=i;

несмотря на то, что у тебя выше стоит

Цитата:

ar_indx: array[1..500] of PChar;

Как ты думаешь, что оно у тебя прочитает при i=0?
Кроме того, когда ты нашел нужный ar_tek, цикл ты продолжаешь зачем-то, а не прерываешь.
И вообще, мне кажется, что форумчанам не сильно интересно тут эту всю бодягу читать, пиши если что в ПМ.
Автор: AdminOrLooser
Дата сообщения: 23.04.2008 08:19
Приветствую всех программеров!

Такой вопрос: реально ли такая вещь:

case combobox1.ItemIndex of
0:begin
.....
begin
.........
end;
end;

1:begin
.....
begin
.........
end;
end;
2: аналогично...


end;

Добавлено:
.....или такая..


case combobox1.ItemIndex of
0:form1.Timer1.Enabled:=true;
1:form1.Timer2.Enabled:=true;
2:form1.Timer3.Enabled:=true;
end;
Автор: ymg2000
Дата сообщения: 23.04.2008 08:38
AdminOrLooser
Реальна.
Автор: Kandus
Дата сообщения: 23.04.2008 09:58
всем привет! Кто поможет? короче в Delphi какой компонент использовать, чтоб типа в mеmо или edit ввел скажем y=Cos(x)+x*x или y=1/х, короче любая фунуция, потом нажимаешь на button, типа ОК и внизу в таблице по заданным значениям Х выдает соответствующие результаты У в виде таблицы. Короче не используя Unit. Эта задача для чайников, чтоб было им понятно. слышал, что есть готовый компонент, не дадите ссылку на скачку.
Автор: AdminOrLooser
Дата сообщения: 23.04.2008 10:32
Здрасте еще разок!

Все предыдущее мне помогло, спасибо!

Есть следующая проблемка: почему когда идет прорисовка (анимация)

procedure TForm1.Button6Click(Sender: TObject);

var sknn, skm:integer;
sknns:string;
begin
skm:=strtoint(edit5.Text);
sknn:= strtoint(edit3.Text);
form1.Label5.Caption:=sknns;
if m<-200 then form1.Timer1.Enabled:=false else begin
randomize;
for n:=1 to nn do begin
xx:=random(form1.Image1.ClientWidth-m) ;
yy:=random(form1.Image1.ClientHeight);
form1.Image1.Canvas.Pixels[xx,yy]:=clwhite;
end;
end;
nn:=(nn+5)+sknn;
m:=(m-4)-skm;
label3.Caption:=timetostr(time-t) ;
end;

Область image1 начинает мерцать. Почему?
Автор: Czechoslovak
Дата сообщения: 23.04.2008 15:00
AdminOrLooser
установи для формы DoubleBuffered:=true, хотя лучше было имедж разместить на панели и для нее установить DoubleBuffered:=true
Автор: AdminOrLooser
Дата сообщения: 23.04.2008 16:07
Не! Бесполезно! Не помогло! Есть какой нить другой вариант?
Автор: RomanTim
Дата сообщения: 23.04.2008 16:37
AdminOrLooser
Создай TBitmap, нарисуй на нем картинку, а когда будет готова Image.Picture.Assign(bmp)
Автор: AdminOrLooser
Дата сообщения: 23.04.2008 19:21
//Не поятно
//Не понятно же...
Автор: RomanTim
Дата сообщения: 23.04.2008 21:45
AdminOrLooser
Код: var
bmp: TBirmap
begin
bmp := TBitmap.Create;
bmp.SetSize(Image1.Width, Image1.Height);
// рисуешь свою картинку по bmp.Canvas
Image1.Picture.Assign(bmp);
bmp.Free;
Автор: Maks150988
Дата сообщения: 24.04.2008 17:57
Здраствуйте. Снова задам свой вопрос. Есть массив:


Код:
var
MenuItems : array [1..19] of TMenuItem =
(
(text : PChar('Данные о программе'); bmp : 0),
(text : PChar('Обсудить на форуме'); bmp : 0),
(text : PChar('Отправить сообщение'); bmp : 0),
(text : PChar('Проверить обновление'); bmp : 0),
(text : 'Свернуть / Развернуть'; bmp : 0),
(text : 'Информация о потоке'; bmp :0),
(text : 'Настройки программы'; bmp : 0),
(text : 'Добавить запись [Ins]'; bmp : 0),
(text : 'Изменить запись [F2]'; bmp : 0),
(text : 'Удалить запись [Del]'; bmp : 0),
(text : 'Обновить плейлист [F5]'; bmp : 0),
(text : 'Список радиостанций'; bmp : 0),
(text : 'Открыть URL адрес'; bmp : 0),
(text : 'Проиграть станцию'; bmp : 0),
(text : 'Остановить станцию'; bmp : 0),
(text : 'Записать станцию'; bmp : 0),
(text : 'Остановить запись'; bmp : 0),
(text : 'Открыть директорию'; bmp : 0),
(text : 'Выход из программы'; bmp : 0)
);
Автор: Kilich
Дата сообщения: 25.04.2008 07:57

Цитата:
Maks150988

Интересный вопрос...
Сам хотел бы услышать ответ, с примерчиком!
Автор: RostY
Дата сообщения: 25.04.2008 08:25
с ресурса не знаю, когда-то я грузил из іні-файла примерно таким способом:
[more]
DovList:=TStringList.Create;
iFile.ReadSection('Dov',DovList);
for i:=0 to DovList.Count-1 do
Begin
DovMenuItem:=TMenuItem.Create(Application);
DovMenuItem.Tag:=i;
DovMenuItem.Caption:=iFile.ReadString('Dov',DovList[i],'');
DovMenuItem.OnClick:=FrmMain.MDovFTPClick;
FrmMain.MDov.Add(DovMenuItem);
End;

а в ini-файле было что-то типа:

[Dov]
d1=оалдіва лдоівадло
d2=вапва вппв куеукеуке
d3=долдлвп куе ьтчбьт
Pr=зщшзвап шзщшвап щшз(одкентьтб)
dd=олдап гшншвап одло (олдыва)


[/more]
Автор: Mandor Sawall
Дата сообщения: 25.04.2008 08:52
Maks150988
Не очень понял, но например:

Код:
type
TMyMenuItem = record
Msg: Pointer;
Bmp: Integer; //? THandle?
end;

resourcestring
SMsg_About = 'Данные о программе';
SMsg_SendMessage = 'Отправить сообщение';

var
MenuItems : array [1..19] of TMyMenuItem = (
(Msg : @SMsg_About; bmp : 0),
(Msg : @SMsg_SendMessage; bmp : 0),
...
Автор: ymg2000
Дата сообщения: 25.04.2008 09:03
Maks150988
Попробуй так:
MenuItems[j].Text := ...;
MenuItems[j].BMP.Assign(...);
А загрузка из ресурса, возможно это пригодится:
[more]
Как поместить JPEG-картинку в exe-файл и потом загрузить ее?


1)Создайте текстовый файл с расширением ".rc".Имя этого файла должно отличаться
от имени файла - пректа или любого модуля проекта.
Файл должен содержать строку вроде: MYJPEG JPEG C: \DownLoad\MY.JPG
где:
"MYJPEG" имя ресурса
"JPEG" пользовательский тип ресурса
"C: \DownLoad\MY.JPG" руть к JPEG файлу.

Пусть например rc - файл называется "foo.rc"

Запустите BRCC32.exe(Borland Resource CommandLine Compiler) - программа находится
в каталоге Bin Delphi / C + +Builder'а - передав ей в качестве параметра полный путь
к rc - файлу.
В нашем примере:

C: \DelphiPath\BIN\BRCC32.EXE C: \ProjectPath\FOO.RC
Вы получите откомпилированный ресурс - файл с расширением ".res".
(в нашем случает foo.res).
Далее добавте ресурс к своему приложению.

{Грузим ресурс}
{$R FOO.RES}

uses Jpeg;

procedure LoadJPEGFromRes(TheJPEG: string; ThePicture: TPicture);
var
ResHandle: THandle;
MemHandle: THandle;
MemStream: TMemoryStream;
ResPtr: PByte;
ResSize: Longint;
JPEGImage: TJPEGImage;
begin
ResHandle := FindResource(hInstance, PChar(TheJPEG), 'JPEG');
MemHandle := LoadResource(hInstance, ResHandle);
ResPtr := LockResource(MemHandle);
MemStream := TMemoryStream.Create;
JPEGImage := TJPEGImage.Create;
ResSize := SizeOfResource(hInstance, ResHandle);
MemStream.SetSize(ResSize);
MemStream.Write(ResPtr^, ResSize);
FreeResource(MemHandle);
MemStream.Seek(0, 0);
JPEGImage.LoadFromStream(MemStream);
ThePicture.Assign(JPEGImage);
JPEGImage.Free;
MemStream.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
LoadJPEGFromRes('MYJPEG', Image1.Picture);
end;
[/more]
Только адаптируй под BMP, это уже найдешь.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.