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

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


Информационный Канал Subscribe.Ru

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

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

Выпуск № 139
от 01.06.2005, 14:30

Администратор:Калашников О.А.
В номере:Вопросов: 9, Ответов: 43


Вопрос № 21358: Как правильно на Delphi создать такой тип данных Номер Наименование 1 Наименование 2 И создать динамический массив такого типа. Чтобы например Переменная.Номер[10] - дала бы мне номер десятой записи ну что то в этом роде....<b...
Вопрос № 21361: Добрый день! Не могу понять в чем причина... При добавлении в ListView Item-ов из другого ListView посредством AddItem() у добавленных Item-ов не видны Caption. Причем они вроде бы есть - в Memo они выводятся, а в ListView2 не видны.<...
Вопрос № 21362: ПОМОГИТЕ!!! Нужно,чтобы при выделении файла ShelListView1 его с помощью Button1 можно было скопировать,при помощи Button2 удалить. Как это сделать?...
Вопрос № 21363: Привет всем! Как программно экспортировать какую-либо ветвь реестра в reg-файл? Т.е. как сделать аналог функции "Файл - Экспорт..." в regedit? Есть ли специальная функция для этой цели? Или самому нужно писать? Заранее благодарен....
Вопрос № 21377: Привет! Хочу сделать конвертер RTF в HTML. Без каких-либо компонентов и прочее. С чего посоветуете начать? Подскажите статьи по обработке строк текста. Спасибо....
Вопрос № 21388: Уважаемые эксперты. Прошу прощения за глупые вопросы 1-У меня в 7 делфи никак не передать переменную на другую форму. (см прилож). Может я чего где не дописал. 2-что такое XPMan Заранее огромное спасибо...
Вопрос № 21402: Здравствуйте, эксперты. Возможно ли в Delphi работать с палитрой цветов, в которой числу 0 соответствует черный цвет, а 255- белый. Может, есть команды для перевода значения цвета точки из стандарта RGB в указанный? Спасибо за ответы....
Вопрос № 21403: Здравствуйте, уважаемые эксперты! В дополнение к вопросу № 21319. Моя программа показывает пользователю список каталогов (например, через ListView). Пользователь выделяет нужные каталоги и жмет на кнопку "Обработка" - и во всех выде...
Вопрос № 21408: Здравствуйте, эксперты. Отвечает: sir henry: "Значения цветов в Дельфи идет от 0 (черный) до 16млн (белый). Естественно под Вас никто палитру сужать не собирался, поэтому Вы сами должны определить ключевые значения цветов и состави...

Вопрос № 21.358
Как правильно на Delphi создать такой тип данных
Номер
Наименование 1
Наименование 2
И создать динамический массив такого типа.
Чтобы например Переменная.Номер[10] - дала бы мне номер десятой записи
ну что то в этом роде....
Отправлен: 26.05.2005, 14:32
Вопрос задал: Sniffer (статус: Студент)
Всего ответов отправлено: 10

Отвечает: uzertt
procedure TForm1.Button2Click(Sender: TObject);
type
T = record
Nomer: Integer;
Name1: string;
Name2: string;
end;
var
A: array of T;
begin
SetLength(A, 11);
A[10].Nomer := 10;
// и т.д. и т.п.
end;
Ответ отправил: uzertt (статус: 1-ый класс)
Отправлен: 26.05.2005, 15:06
Оценка за ответ: 5
Комментарий оценки:
Спасибо

Отвечает: X
Здравствуйте, Sniffer!
Можно сделать так:
type
TNomer=record
a:byte;
b:byte;
end;
Tper=record
nomer:array of TNomer;
end;
var
Form1: TForm1;
peremenaya:Tper;
begin
GetMem(peremenaya.nomer,2*SizeOf(peremenaya.nomer));//Резервируем память на 2 записи
peremenaya.nomer[1].a:=1;
peremenaya.nomer[2].b:=2;
FreeMem(peremenaya.nomer,2*SizeOf(peremenaya.nomer));//Освобождаем память
end.
Ответ отправил: X (статус: 5-ый класс)
Отправлен: 26.05.2005, 15:25

Отвечает: Ujin Antikvar
Здравствуйте, Sniffer!
Для того чтобы переменная под каким-то номером выдала запись зделанную под этим номером нужно ипользовать тип данных запись (record)
В этом типе можно задавать множество под типов например:
У нас какой-то список в котором в одной записи должны присутствовать как цифры так и сомволы. Объявляется тип записи так
Type Tzapis=record //после record точка с запятой не ставится
name1:string[20]; //строковый тип данных
name2:string[20];
Namber:integer; //целый тип данных
-------------- //Можно в тип данных запись вписывать множество типов данных
end; //Закрытие типа данных запись
Потом в разделе переменных ты присваеваешь какой-то переменной этот тип
var
T:TZapis; //Так объявляется для текстовых файлов
T:array[1..100] of TZapis; //Так для типизированных
Теперь можешь управлять данной записью как угодно
т.е. например для твоего случая к десятой записи можно обратится так T[10] //Т-переменная типа записи.
С Ув. Ujin Antikvar
(нужны книги по програмированию на Delphi пиши мне на мыло (arbuznikov@matrix.odessa.ua) я поделюсь)
Ответ отправил: Ujin Antikvar (статус: 1-ый класс)
Отправлен: 26.05.2005, 16:19

Отвечает: Jadd
Здравствуйте, Sniffer!
Очень просто:
//объявляем желаемый тип данных
myType = record
nNumber: Integer;
strName: String;
strName1: String;
end;
//Дальше хорошо бы сделать все это в классе. сделаю в классе для примера
//я опущу реализацию конструктора
TMyHolder = class(TObject)
private
myarray: arrao of myType; //объявляем массив нашего типа
public
procedure AddRecord(record: myType);
function GetRecord(recordNum: integer): myType;
destructor Destroy; override;
end;
.............................
//реализация методов из класса
//сначала деструктор
destructor TMyHolder.Destroy;
begin
//убираем мусор
//тут нужно освободить память, занятую массивом
end;
procedure TMyHolder.AddRecord(record: myType);
begin
//сначала проверим размерность массива
if Length(myarray) = 0 then
begin //выделяем память под массив с одним элементом
SetLength(myarray, 1);
end
else
begin //выделим еще немного места под один элемент
SetLength(myarray, Length(myarray)+1);
end;
//теперь записываем нашу запись - каламбур
myarray[Length(myarray)-1] := record;
end;
function TMyHolder.GetRecord(recordNum: Integer): myType;
var
index: Integer;
rec: myType;
begin
rec := nil;
for index:=0 to Length(myarray)-1 do
begin
//если нашли нужную запись, возвращаем и выходим
if myarray[index].nNumber = recordNum then
begin
rec := myarray[index];
break;
end; //иначе листаем до самого конца
end;
//если нашли, получим запись, иначе nil
result := rec;
end;
Примерно так. Только нужно помнить, что данные в поле nNumber могут не совпадать с индексом массива. Если это важно, тогда нужно писать реиндексацию массива. ИМХО это лишнее. И помни, что первый элемент массива имеет индекс 0, тогда как твои записи могут иметь первым номером 1 - это принципиально, иначе можно получить Access violation за попытку обратиться к области памяти, место для которой не выделено. Пиши, если что, удачи.
---------
Hakuna matata
Ответ отправил: Jadd (статус: 5-ый класс)
Отправлен: 26.05.2005, 16:42

Отвечает: sir henry
Здравствуйте, Sniffer!
Нет ничего проще. Такой тип называется "запись".
Type
MyType = record
Nomer: тип_данных;
Name1: тип_данных;
Name2: тип_данныхж
End;
Динамический массив создается следующим образом:
var
MyDinArray: array of MyType;
т.е. Вы пишете тип массива, но не указываете его размерность. В программе размерность массива можно задать так:
SetLength(MyDinArray, количество_элементов);
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 27.05.2005, 04:48

Отвечает: Stamm
Здравствуйте, Sniffer!
VAr
m:record;
Nom:array[1..10] of string;
end;
Ответ отправил: Stamm (статус: 4-ый класс)
Отправлен: 27.05.2005, 08:13

Отвечает: VBA
Здравствуйте, Sniffer!
Type
TNewType=Record
Number:Integer;
Name1:ShortString;
Name2:ShortString;
End;
Var
NewArray:Array Of TNewType;
X:Integr;
Begin
SetLength(NewArray,Len); //Len-длина массива
X:=NewArray[10].Number;
End;
---------
Неправ вечно юзер, ибо прав всегда Админ!
Ответ отправил: VBA (статус: 4-ый класс)
Отправлен: 27.05.2005, 11:35

Отвечает: Ballon
Здравствуйте, Sniffer!
Используй записи. Например:
type
MyType = record
Nomer : integer;
Naim1,Naim2 : string;
end;
var
mt: MyType;
begin
mt.Nomer := 1;
mt.Naim1 := 'kuuijk';
mt.Naim2 := 'kuuijk';
end;
Ответ отправил: Ballon (статус: 2-ой класс)
Отправлен: 27.05.2005, 14:50

Отвечает: AWS
Здравствуйте, Sniffer!
Создаёшь запись
Taaaa=record
Номер : тип (ну integer например)
Наименование 1: тип
Наименование 2: тип
end;
далее в разделе var или в классе TForm1
описываешь A:array of Taaaa; - это есть динамический массив

setLength(a, 11) выделяешь этой процедурой память под 11 элементов
ВНИМАНИЕ achtung atencion
Нумерация в массиве а начинается с 0 и заканчивается количество_элементов-1
Доступ к переменным a[10].Номер
Ответ отправил: AWS (статус: 1-ый класс)
Отправлен: 27.05.2005, 20:42

Отвечает: streetcat
<b>Здравствуйте, Sniffer!</b>
пожалуйста:
type
MyType = record
Number: integer;
Name1: string;
Name2: string;
end;
далее - динамический массив:
var
dyno: array of MyType;
затем в какой-н. процедуре задаем размер массива:
SetLength(dyno, n); // где n - необходимый размер
---------
boo... boo
Ответ отправил: streetcat (статус: 4-ый класс)
Отправлен: 30.05.2005, 21:30


Вопрос № 21.361
Добрый день!
Не могу понять в чем причина...
При добавлении в ListView Item-ов из другого ListView
посредством AddItem() у добавленных Item-ов не видны Caption.
Причем они вроде бы есть - в Memo они выводятся, а в ListView2 не видны.
Delphi 7.0.4.453
с уважением
IRustam

Приложение:

Отправлен: 26.05.2005, 14:58
Вопрос задал: IRustam (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: X
Здравствуйте, IRustam!
Вот пример в приложении работает.
А вобще если надо скопировать все item-ы то можно сделать проще:
ListView2.Items.Assign(ListView1.Items);

Приложение:

Ответ отправил: X (статус: 5-ый класс)
Отправлен: 26.05.2005, 15:54
Оценка за ответ: 4
Комментарий оценки:
Спасибо, помогло.
Использование New.Assign(Form1.ListView1.Items[i]); - решило проблему, но если оставлять последующий Form1.ListView2.Items.AddItem(Form1.ListView1.Items[i], -1);, то видим дублирование строк, где каждая вторая не содержит Caption. Т.е. загадка осталась.
Мне надо именно работать с каждым Item-ом, с дополнительными проверками (не копировать ВСЕ). А пример был упрощен для устранения всего побочного.
Еще раз спасибо.

Отвечает: AWS
Здравствуйте, IRustam!
Это делается немного не так
Добавляется в ListView немного по другому
...
Item:TListItem;
....
Item:=Form1.ListView2.Items.Add;
Возвращает ссыслку в Item на новую строку
Item.Caption:='Текст который хочешь добавить'

Приложение:

Ответ отправил: AWS (статус: 1-ый класс)
Отправлен: 27.05.2005, 20:42
Оценка за ответ: 3
Комментарий оценки:
Спасибо, но ответ не в тему!
Я не хотел бы перегружать код копируя в явном виде каждый SubItem. Раз есть возможность копировать Item целиком я хотел бы делать именно так. Но почему-то (?) не работает.

Отвечает: streetcat
Здравствуйте, IRustam!
как я понял нужно скопировать все "Item-ы" сразу, тогда простой способ:
listview2.Items.Assign(listview1.Items); // копирование элементов из listview1 в 2
---------
boo... boo
Ответ отправил: streetcat (статус: 4-ый класс)
Отправлен: 30.05.2005, 21:31
Оценка за ответ: 4
Комментарий оценки:
Спасибо, но приведенный пример был упрощен для выявления причины глюка в самом процессе копирования. Мне НЕ нужно копировать ВСЕ итемы. Меня интересовало - почему при копировании вышеприведенным способом наблюдается такой странный эффект. И наблюдается ли он у других, или зависит ли он от каких-либо настроек...


Вопрос № 21.362
ПОМОГИТЕ!!!
Нужно,чтобы при выделении файла ShelListView1 его с помощью Button1 можно было скопировать,при помощи Button2 удалить.
Как это сделать?
Отправлен: 26.05.2005, 14:59
Вопрос задал: Sassoft (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: streetcat
Здравствуйте, Sassoft!
чтобы получить имя выделенного файла (или папки) нужно обратиться к свойству ShellListView.SelectedFolder.PathName,
затем определить, является ли выделенный элемент папкой, свойство
ShellListView.SelectedFolder.IsFolder
а потом пользоваться функциями CopyFile и DeleteFile

---------
boo... boo
Ответ отправил: streetcat (статус: 4-ый класс)
Отправлен: 30.05.2005, 21:31


Вопрос № 21.363
Привет всем!
Как программно экспортировать какую-либо ветвь реестра в reg-файл? Т.е. как сделать аналог функции "Файл - Экспорт..." в regedit? Есть ли специальная функция для этой цели? Или самому нужно писать? Заранее благодарен.
Отправлен: 26.05.2005, 15:09
Вопрос задал: Master89 (статус: 4-ый класс)
Всего ответов отправлено: 4

Отвечает: uzertt
Здравствуйте, Master89!
ShellExecute(Handle, 'Open', 'regedit.exe', '/e "sample.reg" "HKEY_LOCAL_MACHINESoftwareMicrosoft"', nil, SW_SHOWNORMAL);
// Не забудьте Uses ShellAPI...
Ответ отправил: uzertt (статус: 1-ый класс)
Отправлен: 26.05.2005, 16:49
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо! Это то, что мне нужно!

Отвечает: Jadd
Здравствуйте, Master89!
Есть. SaveKey. Правда сам не юзал. Так в хелпе написано, который и тебе советую читать.
---------
Hakuna matata
Ответ отправил: Jadd (статус: 5-ый класс)
Отправлен: 26.05.2005, 19:35
Оценка за ответ: 4

Отвечает: Stamm
Здравствуйте, Master89!
Попробуй это
Параметр /s импортирует значения из reg-файла без вывода диалогового окна
/e экспортирует параметры в reg-файл
regedit /e myfile.reg HKEY_USERS.DEFAULT
Ответ отправил: Stamm (статус: 4-ый класс)
Отправлен: 27.05.2005, 08:12
Оценка за ответ: 5

Отвечает: streetcat
Здравствуйте, Master89!
У класса TRegistry (из модуля Registry) есть метод:
TRegistry.SaveKey(Key: string; FileName: string);
где Key - путь ветви реестра (без корня, напр. без HKEY_LOCAL_MACHINE), а
FileName - имя файла, в который сохранить

---------
boo... boo
Ответ отправил: streetcat (статус: 4-ый класс)
Отправлен: 30.05.2005, 21:31
Оценка за ответ: 5


Вопрос № 21.377
Привет!
Хочу сделать конвертер RTF в HTML. Без каких-либо компонентов и прочее. С чего посоветуете начать?
Подскажите статьи по обработке строк текста.
Спасибо.
Отправлен: 26.05.2005, 19:05
Вопрос задал: 3BEPEK (статус: 3-ий класс)
Всего ответов отправлено: 4

Отвечает: Jadd
Здравствуйте, 3BEPEK!
Хорошо, хоть не по обработке изображений. RTF в HTML "ручками"? МАНЬЯК. Ты хоть в курсе самого формата RTF?Если в курсе, тогда не понятно почему ты спрашиваешь насчет обработки строк. Проже всего загрузить файл в TRichEdit и уже работать с ним. Т.е. брать строку и парсить ее, получая атрибуты символов лексемы. Строка - это массив символов. Получить символ в строке можно просто обратившись к этому символу, используя его индекс в строке. Например, есть строка str:="ЗВЕРЕК". Я хочу получить символ "В". Тогда символ В там будет так str[2]. Можно, конечно получать атрибуты каждого символа в строке, но ты себе это представляешь какой будет HTML? Впрочем, дерзай.
---------
Hakuna matata
Ответ отправил: Jadd (статус: 5-ый класс)
Отправлен: 26.05.2005, 19:20
Оценка за ответ: 4
Комментарий оценки:
Не совсем то. Но спасибо. А маньяк потому что я хочу переписать её потом на ассемблере.

Отвечает: sir henry
Здравствуйте, 3BEPEK!
С изучения форматов RTF и HTML.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 27.05.2005, 07:00
Оценка за ответ: 1
Комментарий оценки:
Гениальный ответ. Кратко и просто, соответственно оценка. ;)

Отвечает: Rusland
Здравствуйте, 3BEPEK!
Скорее всего без компонента здесь не обойтись. Смотри в сторону OLE-Word
Ответ отправил: Rusland (статус: 3-ий класс)
Отправлен: 27.05.2005, 12:52

Отвечает: AWS
Здравствуйте, 3BEPEK!
есть компонент PageProducer1
Через него можно попробовать
А вообще самая хорошая статья это дельфийский хелп
и называются они обычно Samples или example
Ответ отправил: AWS (статус: 1-ый класс)
Отправлен: 27.05.2005, 20:42


Вопрос № 21.388
Уважаемые эксперты.
Прошу прощения за глупые вопросы
1-У меня в 7 делфи никак не передать переменную на другую форму. (см прилож). Может я чего где не дописал.
2-что такое XPMan
Заранее огромное спасибо

Приложение:

Отправлен: 27.05.2005, 02:30
Вопрос задал: twmd (статус: 3-ий класс)
Всего ответов отправлено: 11

Отвечает: sir henry
Здравствуйте, twmd!
А зачем передавать переменную именно на форму? Может быть Вы имели в виду передачу переменной в какую-либо функцию другой формы? Уточните пожалуйста.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 27.05.2005, 06:59

Отвечает: X
Здравствуйте, twmd!
1)Я так понял вам надо использовать эту переменную в другом модуле,тогда всё работает,
конечно если после implementation вы постваилим uses Unit1;
Обращение из других модулей - Form1.cap:='gfg';
2)XPMan нужен для того, чтобы программы в Windows XP, выглядели как в XP.
Ответ отправил: X (статус: 5-ый класс)
Отправлен: 27.05.2005, 08:24

Отвечает: Jadd
Здравствуйте, twmd!
Ваше приложение ничего не показывает: ни правильные действия, ни неправильные. Чтобы передать какой-то аргумент из формы в форму, нужно делать так:
//объявляем переменную в классе формы, куда передаем
public
mystr: String;
//на событие OnShow эту переменную обрабатываем
procedure fdoc.OnShow(Sender: TObject);
begin
//пусть мы хотим отразить ее в компоненте TLabel
Label1.Caption := mystr;
end;
Все. Метод show не может знать о существовании Вашей переменной, т.к. этот метод объявлен совершенно в другом классе, от которого наследует TForm, а от него в свою очередь и ваш fdoc. Поэтому, этому методу нужно дать как-то знать о существовании переменной. И это можно сделать либо как я показал, либо передавая значение переменной в качестве аргумента в какую-то функцию этого класса с тем, чтобы эта функция потом проинициализировала нужные компоненты и вызвала Show, либо явно из вызывающего класса проинициализировать нужный компонент. Последнее не самый хороший метод.
Удачи.
---------
Hakuna matata
Ответ отправил: Jadd (статус: 5-ый класс)
Отправлен: 27.05.2005, 09:31
Оценка за ответ: 5

Отвечает: Bochvarov NikB
Здравствуйте, twmd!
Посматри как люди сделали примерно tOpenDialog - написали метод Execute(const aFileName: string);
Так, если тьи сделаш свой метод Execute:
function tFDoc.Execute(const aCap: string; aNDoc: byte): boolean; //примерно :)
begin
...
Show;
...
end;
А можеш сделать и метод SetCapNDoc (не пользуя Show, а Show сделать pozve) - воображение надо.
Ответ отправил: Bochvarov NikB (статус: 4-ый класс)
Отправлен: 27.05.2005, 10:46

Отвечает: VBA
Здравствуйте, twmd!
XPMan это компонент, позволяющий строить приложения с интерфейсом Windows XP. Достаточно разместить его на форме, и при запуске приложения ві увидите, как изменилась ваша программа (Естествнно, если у вас включен стиль XP в Windows).
Насчет переменных. В разделе Uses объяви модуль модуль формы из которой переменная передаётся.
---------
Неправ вечно юзер, ибо прав всегда Админ!
Ответ отправил: VBA (статус: 4-ый класс)
Отправлен: 27.05.2005, 11:41

Отвечает: Ballon
Здравствуйте, twmd!
Просто в юните второй формы в uses пропиши имя юнита первой вормы.
Ответ отправил: Ballon (статус: 2-ой класс)
Отправлен: 27.05.2005, 11:43

Отвечает: Delphin
Здравствуйте, twmd!
1: А в чем собственно вопрос? Переменные недоступны из другого Unit'a ?
Тогда File -> Use Unit и тут выделяй все свои Unit'ы.
2: У тебя Xp или выше? Когда создаешь программу то заметь у неё кнопки не в
стиле xp даже в ней. Вот этот компонент добавляет маничест который делает все
кнопочки в стиле XP. Незнаешь что такое манифест ( Manifest )? Тогда тебе надо
на MSDN.com
---------
Ищу сервис пак для школы ^)))
Ответ отправил: Delphin (статус: 3-ий класс)
Отправлен: 27.05.2005, 15:37

Отвечает: Gin
Здравствуйте, twmd!
2) Некий прибамбас позволяющий делать интерфейс Вашего приложения подобно Виндовс ХР, то есть - аля ХР. Вот так вот ;)
С Уважением , Gin.
Ответ отправил: Gin (статус: 2-ой класс)
Отправлен: 27.05.2005, 16:41

Отвечает: AWS
Здравствуйте, twmd!
после implementation
пишешь в модуле новой формы
uses unit1;
unit1 это модуль где твои переменные лежат
Доступ к переменной через Form1.cap
При этом модуль твоей формы должен быть прописан в разделе interface
первой формы (ну откуда ты открываешь вторую)
Ответ отправил: AWS (статус: 1-ый класс)
Отправлен: 27.05.2005, 20:42

Отвечает: Stamm
Здравствуйте, twmd!
1)Надо использовать Unit этой формы. Для этого нажимай File-Use Unit
2) Эта штукенция для преобразования кнопок, скролл-баров и т.д. в XP вид. Просто кидаешь на форму и всё
Ответ отправил: Stamm (статус: 4-ый класс)
Отправлен: 27.05.2005, 20:52

Отвечает: streetcat
Здравствуйте, twmd!
1. Заведи в модуле с другой формой подобные переменные и копируй...
2. XPManifest (XPMan) - компонент, добавив который на форму ты сможешь получить
кнопки, панели и др. в стиле Windows XP (результата не видно в режиме разработки формы)

---------
boo... boo
Ответ отправил: streetcat (статус: 4-ый класс)
Отправлен: 30.05.2005, 21:31


Вопрос № 21.402
Здравствуйте, эксперты.
Возможно ли в Delphi работать с палитрой цветов, в которой числу 0 соответствует черный цвет, а 255- белый.
Может, есть команды для перевода значения цвета точки из стандарта RGB в указанный?
Спасибо за ответы.
Отправлен: 27.05.2005, 10:27
Вопрос задал: Lichkaty Alexander (статус: Посетитель)
Всего ответов отправлено: 5

Отвечает: Jadd
Здравствуйте, Lichkaty Alexander!
Есть, но не в дельфи как таковой, а в WINAPI. Есть макрос RGB, есть макрос CMYK. Кстати, 0 - это не черный цвет. Цвет в каждой цветовой системе (RGB, CMYK и другие) есть цветовые составляющие. Например, цвет в RGB состоит из интенсивности красного (R), зеленого (G) и синего (B). Черный в таком представлении - это интенсивности всех трех компонент равные 0, т.е. RGB(0, 0, 0). Соответственно, елый - это 255 для всех трех (RGB(255, 255, 255)). Так вот, в самой дельфи, как и следовало ожидать, нету средств конвертации. Однако, рассчитать цвет RGB в CMYK не составит труда, но нужно учитывать, что очень точного соответствия не добиться по определению. О причинах читай в интернете про все эти цветовые модели (а там их много, включая PAL и NTSC и прочие). Пиши мне на xlcoder@mail.ru и я пришлю тебе пример как перевести из RGB в CMYK и обратно. Замечу лишь одно, что сами макросы RGB и CMYK не конкертируют цвет из одной модели в другую. Они лишь выделяют интенсивности из цветовой конст анты, которую мы в них передаем.
Удачи.
---------
Hakuna matata
Ответ отправил: Jadd (статус: 5-ый класс)
Отправлен: 27.05.2005, 11:08

Отвечает: VBA
Здравствуйте, Lichkaty Alexander!
RGB(r:Byte; g:Byte, b:Byte):Cardinal;
r,g,b - 0..255 - Красный, зеленый и синий цвет, соответственно.
Возвращает номер цвета, состоящего из "смеси" 3 указанных выше цветов.
---------
Неправ вечно юзер, ибо прав всегда Админ!
Ответ отправил: VBA (статус: 4-ый класс)
Отправлен: 27.05.2005, 11:47

Отвечает: sir henry
Здравствуйте, Lichkaty Alexander!
Для этого надо переключить экран в 256-цветный режим. :)
Значения цветов в Дельфи идет от 0 (черный) до 16млн (белый). Естественно под Вас никто палитру сужать не собирался, поэтому Вы сами должны определить ключевые значения цветов и составить, например, массив, где значение Вашего ущербного цвета соответствует значению истиного цвета. А дальше пишите функцию которая ищет в масиве настоящий цвет или сварганьте формулу-корректор, преобразующую 256 цвет в нормальный.
Например:
Function _256to16mln(color256: word): DWord;
Begin
Result:=color256*256*256;
End;
Function RGBto256(r, g, b: byte): byte;
Begin
Result:=RGB(r, g, b) div (256*256);
End;
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 27.05.2005, 12:09

Отвечает: Delphin
Здравствуйте, Lichkaty Alexander!
А справка зачем нужна? Влом читать?
ColorToRGB. Даже по названию ясно что делает :-)
---------
Ищу сервис пак для школы ^)))
Ответ отправил: Delphin (статус: 3-ий класс)
Отправлен: 27.05.2005, 15:41

Отвечает: Gubanov Denis Andreevitch
Здравствуйте, Lichkaty Alexander!
Моделб RGB для градации серого представляет
пропорциональное смешение трех цветов. т. е.
R-х G-х B-х, где х- значение от 0 до 255. Таким образом и получается
градация серого. Програмно єто организовать можно с помощью
функции, не помню конкретно, но что-то вроде GetRGB(Cx). Сх -это
тип TColor или шестнадцатиричный код. Но можно это написать самому так:
TRGB=record
Red:byte;
Green:byte;
Blue:byte;
end;
function GetRGB(Color:TColor):TRGB;
Var
RGB:TRGB;
begin
RGB(Color);
GetRGB:=RGB;
end;
Теперь при вызове этой функции можно записать в
глабальную переменную типа TRGB и получать значения
каждого цвета
Обратная функция работает почти также, только надо
перевести TRGB в TColor.
function SetRGB(ColorRGB:TRGB):TColor;
begin
SetRGB:=ColorRGB.Red*ColorRGB.Green*ColorRGB.Blue;
end;
Ну а загнать в массив array[0..255] of TRGB я думаю труда не составит.
Ответ отправил: Gubanov Denis Andreevitch (статус: 1-ый класс)
Отправлен: 27.05.2005, 20:24


Вопрос № 21.403
Здравствуйте, уважаемые эксперты!
В дополнение к вопросу № 21319.
Моя программа показывает пользователю список каталогов (например, через ListView). Пользователь выделяет нужные каталоги и жмет на кнопку "Обработка" - и во всех выделенных каталогах происходит обработка внешней программой всех файлов.
Под словом "обработка" я понимаю простановку для всех файлов электронно-цифровой подписи.
Через ShellExecute я не могу вызывать внешнюю программу обработки, поскольку выполняемых файлов в программе обработки нет. Есть только dll-библиотеки.
Поэтому я и спрашивал, можно каким-либо образом для каталога (или файла) выполнить команду из контекстного меню Проводника Windows.
Среда разработки - С++ Builder 6.
Отправлен: 27.05.2005, 10:37
Вопрос задал: Alexandr (статус: 2-ой класс)
Всего ответов отправлено: 2

Отвечает: VBA
Здравствуйте, Alexandr!
Это рассылка по Delphi, а не по С++ Builder. Если хотите задать вопрос по С++ обратитесь к соответствующей рассылке или создайте свою.
---------
Неправ вечно юзер, ибо прав всегда Админ!
Ответ отправил: VBA (статус: 4-ый класс)
Отправлен: 27.05.2005, 11:54

Отвечает: sir henry
Здравствуйте, Alexandr!
Как-то все это сложно. DLL - это всего лишь набор функций, но отнюдь не программа. Если Вы знаете эти функции, то вызывайте их из своей программы, а в качестве параметра будете передавать каталог с файлами.
Насколько я знаю, чтобы вызвать функцию из DLL нужна В ОБЯЗАТЕЛЬНОМ ПОРЯДКЕ какая либо программа - экзешник. И если Вы утверждаете, что в програме обработки экзешника нет, то скорее всего Вы невнимательно ее исследовали.
Опять же, команда из контекстного меню проводника может запустить экзешник с теми или иными параметрами, например DrWeb или WinRAR.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 27.05.2005, 12:18


Вопрос № 21.408
Здравствуйте, эксперты.
Отвечает: sir henry: "Значения цветов в Дельфи идет от 0 (черный) до 16млн (белый).
Естественно под Вас никто палитру сужать не собирался, поэтому Вы сами должны
определить ключевые значения цветов и составить, например, массив, где значение
Вашего ущербного цвета соответствует значению истиного цвета.
А дальше пишите функцию которая ищет в масиве настоящий цвет "
Как составить массив из 256 ключевых цветов, состоящий из стандартных цветов
256-цветной палитры? Где взять эти значения в RGB?
Спасибо за ответы.

Приложение:

Отправлен: 27.05.2005, 12:35
Вопрос задал: Lichkaty Alexander (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: Jadd
Здравствуйте, Lichkaty Alexander!
Что за бред? Я же говорю, 255 соответствует максимальной интенсивности компонента в конкретной цветовой модели. Т.е. цвет 255, 255, 255 = белый в модели RGB. Эти же значения интенсивности соответствуют черному цвету в CMYK, но там еще четвертый компонент 255. Читайте книгу "программирование графики для windows", где описаны многие аспекты этого. Пишите на мыло, которое я вам дал и я вам пришлю пример конвертации из одной цветовой модели в другую. Линков дам, где почитать.
---------
Hakuna matata
Ответ отправил: Jadd (статус: 5-ый класс)
Отправлен: 27.05.2005, 16:26

Отвечает: AWS
Здравствуйте, Lichkaty Alexander!
Есть тип TColor
Это тип размером 4 байта.
В нём хранятся значения 3 компонент цвета (4 не используется) в 16 разрядном исчеслении
Для работы есть функции GetRValue(c:TColor):byte
GetGValue(c:TColor):byte
GetBValue(c:TColor):byte
и RGB(r,g,b:byte):TColor;
ТО есть можно задать каждый цвет 3 компонентами В каждой из них 256 значений
Итого где то приблиз 16 000 000 цветов.
Ответ отправил: AWS (статус: 1-ый класс)
Отправлен: 27.05.2005, 20:42

Отвечает: sir henry
Здравствуйте, Lichkaty Alexander!
Я же Вам привел примерчик???? Неужели не заметили??? :)
Если честно, я в полной растерянности, попробуйте еще раз внимательно просмотреть мой предыдущий ответ. Если что-то будет непонятно - пишите.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 30.05.2005, 08:38


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

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

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

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

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


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


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное