Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Пара вопросов по Delphi


Рекомендуемые сообщения

Есть пара вопросов по делфи.

1. Используя компонент ListBox, при щелчке на пунктах открывается в WebBrowser(точное название компонента не помню) разные html. Как сократить код? Т.е. чтобы постоянно не прописывать что если выбран пункт 1, то откроется 1, 2-2? Массив завести?

2. Как в Delphi 6 в программах сделать кнопки XP'шные? В стиле ХР, а не квадратны классические?

Ссылка на комментарий
Поделиться на другие сайты

1. Используя компонент ListBox, при щелчке на пунктах открывается в WebBrowser(точное название компонента не помню) разные html. Как сократить код? Т.е. чтобы постоянно не прописывать что если выбран пункт 1, то откроется 1, 2-2? Массив завести?

имя html файлов сделать одинаковыми

в конце каждого имени ставить номер соответствующий номеру строки listbox

комбинировать: имя файла + номер строки listbox (они начинаются с нуля) + расширение

открывать полученный файл

2. Как в Delphi 6 в программах сделать кнопки XP'шные? В стиле ХР, а не квадратны классические?

можно попробовать использовать манифест

(если не ошибаюсь, манифест только для Win XP)

а можно перерисовывать изображение кнопки

Ссылка на комментарий
Поделиться на другие сайты

nusya24:

Первое я сделал так:

procedure TForm1.ListBox1Click(Sender: TObject);begina:=getcurrentdir;Case Listbox1.ItemIndex of0:WebBrowser1.Navigate(a+'\html\Predislovie.htm');1:WebBrowser1.Navigate(a+'\html\Glava 1.htm');2:WebBrowser1.Navigate(a+'\html\Glava 2.htm');3:WebBrowser1.Navigate(a+'\html\Glava 3.htm');4:WebBrowser1.Navigate(a+'\html\Glava 4.htm');5:WebBrowser1.Navigate(a+'\html\Glava 5.htm');6:WebBrowser1.Navigate(a+'\html\Glava 6.htm');7:WebBrowser1.Navigate(a+'\html\Glava 7.htm');8:WebBrowser1.Navigate(a+'\html\Glava 8.htm');9:WebBrowser1.Navigate(a+'\html\Glava 9.htm');10:WebBrowser1.Navigate(a+'\html\Bib.htm');end;

Но это не то.

А как сделать манифест?

И ещё: как сделать так чтобы при создании формы в качстве фона грузилась картинка, но не из самого exe'шника, а из файла ресурса?

Изменено пользователем Darth Emil
Ссылка на комментарий
Поделиться на другие сайты

На VB я бы сделал так:

If Listbox1.ListIndex = 0 ThenWebbrowser.Navigate "Info.htm"ElseIf Listbox1.ListIndex = 9 ThenWebbrowser.Navigate "Bib.htm"ElseWebbrowser.Navigate "Glava " & Listbox1.ListIndex & ".htm"End If

Писал по памяти, за работу кода один в один не ручаюсь, но идея понятна, на Delphi переписать это труда не составит.

А на счет манифеста, попробуй создать файл в папке с прогой с названием твоей проги + .manifest, например "Proga.exe.manifest" такого содержания:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity name="exe.exe" processorArchitecture="x86" version="5.1.0.0" type="win32"/>

<description>

Description

</description>

<dependency>

<dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"/>

</dependentAssembly>

</dependency>

</assembly>

Ссылка на комментарий
Поделиться на другие сайты

На VB я бы сделал так:
If Listbox1.ListIndex = 0 ThenWebbrowser.Navigate "Info.htm"ElseIf Listbox1.ListIndex = 9 ThenWebbrowser.Navigate "Bib.htm"ElseWebbrowser.Navigate "Glava " & Listbox1.ListIndex & ".htm"End If

Cерия последовательных if'ов будет работать медленнее чем case, и является менее наглядной. Так что если выбирать между последовательными if'ами и case - выбор однозначно в пользу case. А вообще, ИМХО самая удачная идея - это все-таки массив. Инициализация его происходит один раз, а дальше - просто обращения к элементам. Простейший вариант будет выглядеть примерно так:

...// В глобальных переменныхPagesLinks : array [0..10] of string;... // В конструкторе формы:PagesLinks[0] := '\html\Predislovie.htm';PagesLinks[1] := '\html\Glava 1.htm';...PagesLinks[10] := '\html\Bib.htm';...procedure TForm1.ListBox1Click(Sender: TObject);begin a:=getcurrentdir; WebBrowser1.Navigate(a+PagesLinks[Listbox1.ItemIndex]);end;

Код нагляднеее, да и работать должен быстренько.

Но можно пойти и еще дальше. Представь что тебе нужно вставить еще одну страницу между Предисловием и первой главой, например содержание, или отзывы, неважно. Тебе придется руками менять номера элементов всего массива. А еще надо будет проследить, чтобы в ListBbox'е правильно были проставлены названия страниц. А если надо вставить пять - десять страниц? Вот пример еще одного подхода (для краткости кода я сократил количество страниц до четырех):

...// В глобальных переменныхTPages = (pPredislovie, pGlava1, pGlava2, pBib);TPCategory = (pcName, pcLink);Pages : array [TPLCategory][TPages] of string;... // В конструкторе формы:Pages[plcName, pPredislovie] := 'Предисловие';Pages[plcName, pGlava1] := 'Глава 1';Pages[plcName, pGlava2] := 'Глава 2';Pages[plcName, pBib] := 'Литература';Pages[plcLink, pPredislovie] := '\html\Predislovie.htm';Pages[plcLink, pGlava1] := '\html\Glava 1.htm';Pages[plcLink, pGlava2] := '\html\Glava 2.htm';Pages[plcLink, pBib] := '\html\Bib.htm';// ListBox1 изначально должен быть без полей, теперь заполняем:for i:=pPredislovie to pBibbegin Form1.ListBox1.Items.Add(Pages[pcName][i])end...procedure TForm1.ListBox1Click(Sender: TObject);begin WebBrowser1.Navigate(getcurrentdir+Pages[pcLink][Listbox1.ItemIndex]);end;

Теперь при добавлении новых страниц смена номеров произойдет сама (кроме добавления перед первой и после последней, там есть небольшие тонкости). К тому же стало проще следить за соответствием названия страницы в ListBox'e и соответствующей ссылки - помогают "говорящие" значения индексов массива, которые однозначно лучше безликих цифр:

Pages[plcName, pPredislovie] := 'Предисловие';Pages[plcLink, pPredislovie] := '\html\Predislovie.htm';

Можно работать еще дальше, читать список страниц из файла (это позволит изменять содержание справочника просто добавляя html-файлы со страницами и изменяя в текстовом редакторе файл со списком страниц, при этом перекомпиляция кода не нужна)...

Все зависит от твоего желания и настроения. ;)

Ссылка на комментарий
Поделиться на другие сайты

И ещё: как сделать так чтобы при создании формы в качстве фона грузилась картинка, но не из самого exe'шника, а из файла ресурса?

загружаешь Image Editor, открываешь в нем файл ресурсов

создаешь новый раздел "Bitmap"

В этом разделе создаешь новые "Bitmap" (имя каждого битмапа запомни, он понадобится тебе в коде программы)

Только учти что Image editor позволит тебе создать только максимум 256 цветовые изображения, так что лучше воспользоваться каким-нибудь ресторатором.

В коде пишеш:

var aaa:TPictures;

aaa.Bitmap.Handle:=LoadBitmap(HInstance, 'ИМЯ БИТМАПА');

или

Image1.Bitmap.Handle:=LoadBitmap(HInstance, 'ИМЯ БИТМАПА');

не забудь создать "aaa"

Ссылка на комментарий
Поделиться на другие сайты

По первому и второму вопросу всё решил своим путём. А насчёт ресурсов: как ещё туда html'ки впихнуть и звук?

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Я воткнул html и wav и картинки с помощью Restorator'а в файл ресурсов. Как теперь их оттуда вытаскивать?

Ещё: как сделать так чтобы программа не отображалась на панели задач и в трее, т.е. типа как диалоговое окно?

И как сделать так, чтобы можно было таскать прогу за форму, а не только за заголовок?

Ссылка на комментарий
Поделиться на другие сайты

  • 11 месяцев спустя...

Запарился с получением серийника и ключа. Давно уже скачал Делфи 6. Жму на "Join Now!" и попадаю на страницу регистрации. Но эта тварь не хочет меня регить и выдаёт:

Server Error in '/' Application

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Кто-нибудь сталкивался с подобной проблемой? Как решали?

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...