Jump to content

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


Recommended Posts

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

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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'шника, а из файла ресурса?

Edited by Darth Emil
Link to comment
Share on other sites

На 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>

Link to comment
Share on other sites

На 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-файлы со страницами и изменяя в текстовом редакторе файл со списком страниц, при этом перекомпиляция кода не нужна)...

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

Link to comment
Share on other sites

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

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

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

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

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

В коде пишеш:

var aaa:TPictures;

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

или

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

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

Link to comment
Share on other sites

  • 2 weeks later...

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

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

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

Link to comment
Share on other sites

  • 11 months later...

Запарился с получением серийника и ключа. Давно уже скачал Делфи 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.

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...