RusFAQ.ru: Программирование на Delphi
Информационный Канал Subscribe.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 |
© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.
Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки:
comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль
В избранное | ||