science_and_life:isxodniki
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionLast revisionBoth sides next revision | ||
science_and_life:isxodniki [2008/12/11 13:01] – внешнее изменение 127.0.0.1 | science_and_life:isxodniki [2017/03/13 17:14] – 84.180.171.72 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== исходники ====== | + | Парник |
- | + | Каркас парника представляет из себя набор пластиковых дуг диаметром | |
- | <code delphi> | + | Самовывоз из более 100 пунктов выдачи и доставка по всей стране. Артикул |
- | {excel2djvu - конвертор xls файлов с содержанием журнала в HTML формат для создания DJVU архива. | + | |
- | + | ||
- | Copyright (C) 2006 by Alexander Sorkin aka Kibi | + | |
- | + | ||
- | This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. | + | |
- | + | ||
- | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. | + | |
- | + | ||
- | You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | + | |
- | + | ||
- | 11.11.2006 | + | |
- | Alexander Sorkin aka Kibi | + | |
- | kibizoid@gmail.com | + | |
- | http:// | + | |
- | + | ||
- | ****************************************************************************************} | + | |
- | + | ||
- | // Исходный код основан на примере работы с Excel человека по имени Злой и опубликованного | + | |
- | //для свободного использования на сайте Королевство Дельфи. | + | |
- | + | ||
- | unit Unit1; | + | |
- | + | ||
- | interface | + | |
- | + | ||
- | uses | + | |
- | Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, | + | |
- | ComObj, ActiveX, shellapi, FileCtrl, | + | |
- | {$IFDEF VER120} | + | |
- | OleCtrls, // Почем-то так написано у меня - по-моему для D5 это лишнее. | + | |
- | // Это склероз или диабет, | + | |
- | {$ENDIF} | + | |
- | Excel8TLB, StdCtrls, ExtCtrls, ComCtrls, SHDocVw; | + | |
- | + | ||
- | + | ||
- | type | + | |
- | TForm1 = class(TForm) | + | |
- | StatusBar1: TStatusBar; | + | |
- | OpenDialog1: | + | |
- | PageControl2: | + | |
- | TabSheet1: TTabSheet; | + | |
- | Panel1: TPanel; | + | |
- | html_preview: | + | |
- | TabSheet2: TTabSheet; | + | |
- | tree_preview: | + | |
- | SaveDialog1: | + | |
- | Panel2: TPanel; | + | |
- | PageControl1: | + | |
- | simple_tab: TTabSheet; | + | |
- | grp_simple_volume: | + | |
- | btn_simple_volume: | + | |
- | complex_tab: | + | |
- | btn_Initiate_Data: | + | |
- | chk_debug_mode: | + | |
- | btn_Collect_Data: | + | |
- | GroupBox1: TGroupBox; | + | |
- | Button1: TButton; | + | |
- | Button2: TButton; | + | |
- | ErrorLog: TListView; | + | |
- | TabSheet3: TTabSheet; | + | |
- | single_volume_tree: | + | |
- | local_progress: | + | |
- | global_progress: | + | |
- | edt_volumes: | + | |
- | btn_Create_Global_Content: | + | |
- | Label1: TLabel; | + | |
- | Bevel1: TBevel; | + | |
- | chk_make_bookmarks: | + | |
- | chk_make_authors: | + | |
- | chk_make_rubriks: | + | |
- | chk_make_content: | + | |
- | procedure FormDestroy(Sender: | + | |
- | procedure Initiate_Data(Sender: | + | |
- | procedure Local_Content_Create(Sender: | + | |
- | procedure FormCreate(Sender: | + | |
- | procedure Global_Content_Create(Sender: | + | |
- | procedure btn_simple_volumeClick(Sender: | + | |
- | procedure btn_Collect_DataClick(Sender: | + | |
- | procedure Button1Click(Sender: | + | |
- | procedure Button2Click(Sender: | + | |
- | private | + | |
- | { Private declarations } | + | |
- | FIXLSApp: Excel8TLB._Application; | + | |
- | FIWorkbook, | + | |
- | AllContent, fileDJVU_Bookmarks, | + | |
- | // Все ОНО тут! | + | |
- | // Оформлено отдельными процедурами из противности. | + | |
- | // Впрочем, | + | |
- | procedure CreateExcel (NewInstance: | + | |
- | procedure ShowExcel; | + | |
- | //procedure HideExcel; | + | |
- | procedure ReleaseExcel; | + | |
- | procedure ShowTree; | + | |
- | procedure MakeContent; | + | |
- | procedure ExportHTML(all: | + | |
- | procedure CreateBook; | + | |
- | procedure CreateTOC; | + | |
- | procedure Load_complex_rubriks; | + | |
- | procedure Load_rubriks_groups; | + | |
- | procedure CreateBatches; | + | |
- | function compare_rubriks(rubriki, | + | |
- | procedure sort_articles; | + | |
- | procedure ShowMessageInLog(year, | + | |
- | public | + | |
- | { Public declarations } | + | |
- | // Свойство, | + | |
- | property IXLSApp: Excel8TLB._Application read FIXLSApp; | + | |
- | property IWorkbook: Excel8TLB._Workbook read FIWorkbook; | + | |
- | property IWorkbook2: Excel8TLB._Workbook read FIWorkbook2; | + | |
- | end; | + | |
- | Const Make_Single = false; | + | |
- | Make_Global = true; | + | |
- | min_year = 1990; | + | |
- | max_year = 2005; | + | |
- | max_toc_triplet = 7; | + | |
- | max_complex_rubriks = 5; | + | |
- | + | ||
- | Type ContentElement = class | + | |
- | | + | |
- | year_vol_str : string; | + | |
- | str_vol : string; | + | |
- | rubrika : string; | + | |
- | author : string; | + | |
- | title : string; | + | |
- | page : string; | + | |
- | link : string; | + | |
- | volume : string; | + | |
- | year : string; | + | |
- | function ColoredResult: | + | |
- | constructor Create(rubrika, | + | |
- | | + | |
- | + | ||
- | Type TMyContent = record | + | |
- | rubrika : string; | + | |
- | author : string; | + | |
- | title : string; | + | |
- | page : string; | + | |
- | link : string; | + | |
- | volume : string; | + | |
- | year : string; | + | |
- | used_as_slave: | + | |
- | used_as_article: | + | |
- | | + | |
- | | + | |
- | name : string; | + | |
- | index : integer; | + | |
- | | + | |
- | | + | |
- | name : string; | + | |
- | index : integer; | + | |
- | other_rubrik : string; | + | |
- | | + | |
- | | + | |
- | name: | + | |
- | index: integer; | + | |
- | count: integer; | + | |
- | triplet: string; | + | |
- | surname: string; | + | |
- | | + | |
- | | + | |
- | name: | + | |
- | index: integer; | + | |
- | count: integer; | + | |
- | sinonim: string; | + | |
- | common: integer; | + | |
- | group_number: | + | |
- | number : integer; | + | |
- | | + | |
- | | + | |
- | triplet: | + | |
- | index: integer; | + | |
- | count: integer; | + | |
- | letter: string; | + | |
- | toc_triplets_index: | + | |
- | | + | |
- | | + | |
- | rubrika: string; | + | |
- | sinonim: string; | + | |
- | | + | |
- | | + | |
- | rubrika: | + | |
- | is_table_rubrik: | + | |
- | | + | |
- | | + | |
- | group: string; | + | |
- | rubriks: TStringList; | + | |
- | | + | |
- | type TRubr_Info = class(TObject) | + | |
- | | + | |
- | info : rubriks_element; | + | |
- | constructor Create(init_info: | + | |
- | | + | |
- | var | + | |
- | Form1: TForm1; | + | |
- | VolumeContent: | + | |
- | Rubriki: | + | |
- | Rubriks_groups: | + | |
- | prog_path: string; | + | |
- | simple_mode: | + | |
- | implementation | + | |
- | + | ||
- | {$R *.DFM} | + | |
- | constructor TRubr_Info.Create(init_info: | + | |
- | begin | + | |
- | | + | |
- | end; | + | |
- | function ContentElement.ColoredResult: | + | |
- | begin | + | |
- | // | + | |
- | end; | + | |
- | + | ||
- | constructor ContentElement.Create(rubrika, | + | |
- | begin | + | |
- | self.rubrika := rubrika; | + | |
- | self.author := author; | + | |
- | self.title := title; | + | |
- | self.page := page; | + | |
- | self.link := link; | + | |
- | self.volume := volume; | + | |
- | self.year := year; | + | |
- | if ((year = ' | + | |
- | | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | + | ||
- | procedure TForm1.CreateExcel(NewInstance: | + | |
- | var IU: IUnknown; | + | |
- | isCreate: boolean; | + | |
- | begin | + | |
- | // Tricks: | + | |
- | // в случает вызова Excel-а, как сервера автоматизации: | + | |
- | // - все автозагружаемые книги не загружаются (и слава богу!); | + | |
- | // - создается процесс, | + | |
- | // естественно, | + | |
- | if not Assigned(IXLSApp) then begin // а зачем его создавать, | + | |
- | isCreate := NewInstance or | + | |
- | (not SUCCEEDED( GetActiveObject(Excel8TLB.CLASS_Application_, | + | |
- | if isCreate then | + | |
- | FIXLSApp := CreateComObject(Excel8TLB.CLASS_Application_) as Excel8TLB._Application | + | |
- | else | + | |
- | FIXLSApp := IU as Excel8TLB._Application; | + | |
- | end; | + | |
- | end; | + | |
- | procedure TForm1.ShowMessageInLog(year, | + | |
- | var newItem: | + | |
- | begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | procedure TForm1.ShowExcel; | + | |
- | begin | + | |
- | // Tricks: | + | |
- | // Приведение | + | |
- | // warning-ов типа " | + | |
- | // | + | |
- | // lcid - что такое? Что-то насчет локализации, | + | |
- | // Но вы всегда можете спокойно передать 0 вместо lcid. | + | |
- | // | + | |
- | // Так | + | |
- | // Вроде бы, достаточно просто Visible := true. Черта с два! | + | |
- | // Комментируем строки с условием на минимизацию и ScreenUpdating. | + | |
- | // Делаем CreateExcel, | + | |
- | // возвращаемся в приложение и делаем еще раз ShowExcel! И что? | + | |
- | // Насколько | + | |
- | // но окно-то не раскроется. Поэтому проверка на xlMinimize. | + | |
- | // | + | |
- | // Что здесь делает ScreenUpdating? | + | |
- | // - раскомментим строки с условием на минимайз; | + | |
- | // - CreateExcel; | + | |
- | // - ShowExcel; | + | |
- | // - закрываем (мышью) Excel (можно через Файл\Закрыть); | + | |
- | // - смотрим в процессы - Excel не выгрузился (так оно и понятно - интерфейс не освободили); | + | |
- | // - Главное! Делаем ShowExcel - имеем право. | + | |
- | // При последнем действии Excel у меня активизируется, | + | |
- | // Эту проблему последняя строка и решает. Этот баг я называю " | + | |
- | // А мы тут полупрозрачные окна рисуем. Наверняка, | + | |
- | if Assigned(IXLSApp) then begin | + | |
- | IXLSApp.Visible[0] := true; | + | |
- | // | + | |
- | if IXLSApp.WindowState[0] = TOLEEnum(Excel8TLB.xlMinimized) then | + | |
- | IXLSApp.WindowState[0] := TOLEEnum(Excel8TLB.xlNormal); | + | |
- | IXLSApp.ScreenUpdating[0] := true; | + | |
- | IXLSApp.DisplayAlerts[0] := true; | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | (*procedure TForm1.HideExcel; | + | |
- | begin | + | |
- | if Assigned(IXLSApp) then begin | + | |
- | IXLSApp.Visible[0] := false; | + | |
- | end; | + | |
- | end;*) | + | |
- | + | ||
- | procedure TForm1.ReleaseExcel; | + | |
- | begin | + | |
- | // Tricks: | + | |
- | // Верни пользователю его Excel!!! | + | |
- | // Считаем, | + | |
- | // бы потом увидеть. А то ж можно сделать Excel-у Hide и Release. И что? | + | |
- | // Если там осталась книга, которая правилась - процесс останется, | + | |
- | // его не увидишь - только в списке процессов. | + | |
- | // Так решим эту проблему следующим образом: | + | |
- | if Assigned(IXLSApp) then begin | + | |
- | // если есть книга и мы невидимы | + | |
- | if (IXLSApp.Workbooks.Count > 0) and (not IXLSApp.Visible[0]) then begin | + | |
- | // положим аккуратненько (правильно написал это | + | |
- | IXLSApp.WindowState[0] := TOLEEnum(xlMinimized); | + | |
- | // а потом покажем, | + | |
- | IXLSApp.Visible[0] := true; | + | |
- | // ну, и после вернем фокус форме и приложению, | + | |
- | // происходит. | + | |
- | // Собственно говоря, | + | |
- | // WindowState меня периодически пугает своей неоднозначностью. | + | |
- | // Дельфийная альтернатива Visible, SetFocus, WindowState работает четко. | + | |
- | if not(csDestroying in ComponentState) then Self.SetFocus; | + | |
- | // Объясню вопросом. Какой SetFocus, если приложение (форма) закрывается? | + | |
- | Application.BringToFront; | + | |
- | end; | + | |
- | end; | + | |
- | // Tricks: | + | |
- | // Главное мое правило: | + | |
- | // Эта привычка выработана давно. Освобождаю даже локально объявленные переменные-интерфейсы. | + | |
- | // То есть блок finally всегда присутствует с такими присваиваниями. | + | |
- | // Совет начинающим от начинающего: если чего-то не выгружается - проверь, освобождаются ли | + | |
- | // все использованные интерфейсы, | + | |
- | // Кстати, последнее - дурной стиль. | + | |
- | // Максималист, | + | |
- | // экземпляр класса, | + | |
- | // Для использования Excel у меня существует несколько классов. | + | |
- | // Это классы XL Report - низкоуровневый набор компонентов, | + | |
- | // создание одного отчета по нескольким TDataSet. А вся подсистема отчетов описана еще одним | + | |
- | // классом, | + | |
- | // описания этих запросов (Это запросы. Параметризованные, | + | |
- | // завязано на COM и ActiveX Scripting. Это не оттого, | + | |
- | // давно понять, | + | |
- | // МоеПриложение.Application. Это не мода, это, по-моему, | + | |
- | FIXLSApp := nil; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.FormCreate(Sender: | + | |
- | begin | + | |
- | prog_path: | + | |
- | if not DirectoryExists(prog_path+' | + | |
- | CreateExcel(false); | + | |
- | ShowExcel; | + | |
- | Application.BringToFront; | + | |
- | if fileexists(prog_path+' | + | |
- | if not simple_mode then CreateBook; | + | |
- | if simple_mode then begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | Rubriki: | + | |
- | // Rubriki.LoadFromFile(prog_path+' | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.FormDestroy(Sender: | + | |
- | begin | + | |
- | FIWorkbook.Close(EmptyParam, | + | |
- | FIWorkbook: | + | |
- | FIWorkbook2: | + | |
- | ReleaseExcel; | + | |
- | Rubriki.Free; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.CreateBook; | + | |
- | var FullFileName: | + | |
- | x: | + | |
- | Value: OLEVariant; | + | |
- | begin | + | |
- | if simple_mode then begin | + | |
- | | + | |
- | if OpenDialog1.Execute then begin | + | |
- | | + | |
- | | + | |
- | end else FullFileName := prog_path + ' | + | |
- | if Assigned(IXLSApp) and (not Assigned(IWorkbook) ) then | + | |
- | try | + | |
- | try | + | |
- | FIWorkbook := IXLSApp.Workbooks.Open(FullFileName, | + | |
- | | + | |
- | | + | |
- | edt_volumes.Items.Clear; | + | |
- | edt_volumes.Sorted: | + | |
- | for x:=1 to IWorkbook.Names.Count do begin // прочесть | + | |
- | | + | |
- | | + | |
- | // префикс к номеру в списке нам не нужен - чтобы оставались чистые yyyy_mm (имя в экселе не может начинаться с цифры) | + | |
- | end; | + | |
- | edt_volumes.Sorted: | + | |
- | if edt_volumes.Items.Count> | + | |
- | finally | + | |
- | ShowExcel; | + | |
- | Application.BringToFront; | + | |
- | end; | + | |
- | except | + | |
- | raise Exception.Create(' | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.Initiate_Data(Sender: | + | |
- | { | + | |
- | Простановка именованных диапазонов | + | |
- | Исходные данные - уже открытый XLS файл, лист " | + | |
- | Конечный результат - именованные диапазоны в XLS файле | + | |
- | Происходит сброс | + | |
- | + | ||
- | Именно тут надо сделать разбор списка авторов и построение списка " | + | |
- | а так же списка " | + | |
- | + | ||
- | Сам процесс разбора - поэтапный | + | |
- | - построение неупорядоченного списка 1 автор - 1 ссылка на статью | + | |
- | - сортировка созданного списка по авторам / статьям | + | |
- | + экспорт в текстовый файл статистики - автор/ | + | |
- | + статистика, | + | |
- | + регалии | + | |
- | + | ||
- | Запользование этого списка идёт уже на этапе построения авторского указателя и рубрикатора соответственно | + | |
- | потому как в одной строке не получается хранить больше 1000 символов и 500 ссылок в одну строку на укладываются :( | + | |
- | + | ||
- | Оглавление по авторам - также три уровня | + | |
- | - первый уровень - таблица на одну страницу - алфавит с уточнением - диапазонами из трёх букв | + | |
- | Количество диапазонов | + | |
- | - второй уровень - полный перечень авторов для каждого диапазона | + | |
- | - третий - перечень статей для каждого автора (возможно с фоткой и краткой биографией) | + | |
- | + | ||
- | + | ||
- | } | + | |
- | var vYear, vMonth, vAuthor, vRubrika, Values, prevValue, outValues: OLEVariant; | + | |
- | ISheet, ISheet_auth_index, | + | |
- | ISheet_triplet, | + | |
- | IRange: Excel8TLB.Range; | + | |
- | //IR1, IR2: IxlRange; | + | |
- | articles: array of TMyContent; | + | |
- | auth_index: | + | |
- | authors: array of authors_element; | + | |
- | triplets: array of triplets_element; | + | |
- | rubr_index: array of rubr_index_element; | + | |
- | rubriks: array of rubriks_element; | + | |
- | sinonims: array of sinonims_element; | + | |
- | rubriks_type: | + | |
- | x, first, | + | |
- | stroka, | + | |
- | auth_index_counter, | + | |
- | authors_counter, | + | |
- | triplet_counter: | + | |
- | rubr_index_counter, | + | |
- | rubriks_counter: | + | |
- | + | ||
- | function get_sinonim(rubrika: | + | |
- | // вычисляем синоним рубрики (по предварительно составленному вручную списку) | + | |
- | // список синонимов находится в массиве sinonims | + | |
- | var x: | + | |
- | begin | + | |
- | for x:=0 to length(sinonims)-1 do begin | + | |
- | if sinonims[x].rubrika=rubrika then begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | function get_rubrik_type(calculated_type: | + | |
- | // получаем тип рубрики (по вычисленному типу и предварительно составленному вручную списку) | + | |
- | // список типов рубрик от пользователя находится в массиве rubriks_type | + | |
- | var x: | + | |
- | begin | + | |
- | for x:=0 to length(rubriks_type)-1 do begin | + | |
- | if rubriks_type[x].rubrika = rubrika then begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | procedure process_rubriks(rubriki: | + | |
- | function other_rubriks(rubriks: | + | |
- | var x: integer; | + | |
- | temp_str: | + | |
- | begin | + | |
- | | + | |
- | for x:=0 to rubriks.Count-1 do begin | + | |
- | if x<i then begin // запомнить все рубрики до i - " | + | |
- | if temp_str = '' | + | |
- | then temp_str := rubriks[x] | + | |
- | else temp_str := temp_str + ' | ' + rubriks[x]; | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | var x: | + | |
- | temp: | + | |
- | mas: | + | |
- | begin | + | |
- | if rubriki='' | + | |
- | + | ||
- | | + | |
- | + | ||
- | | + | |
- | | + | |
- | for x:=1 to length(rubriki) do begin // разбиваем строку на подстроки, | + | |
- | if rubriki[x]=' | + | |
- | mas.Add(temp); | + | |
- | temp: | + | |
- | end else temp: | + | |
- | | + | |
- | | + | |
- | for x := 0 to mas.Count-1 do begin | + | |
- | setlength(rubr_index, | + | |
- | rubr_index[rubr_index_counter].name: | + | |
- | rubr_index[rubr_index_counter].index: | + | |
- | rubr_index[rubr_index_counter].other_rubrik := other_rubriks(mas, | + | |
- | inc(rubr_index_counter); | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | function extract_surname(name: | + | |
- | {фамилия вычленяется следующим образом - берётся конец строки до пробела "М. Иванов", | + | |
- | Итого, алгоритм критичен к отсутствию пробела после точки - это можно исправить, | + | |
- | " | + | |
- | var temp: | + | |
- | x: | + | |
- | begin | + | |
- | | + | |
- | for x: | + | |
- | if name[x]=' | + | |
- | temp := name[x] + temp; | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | function check_name(name: | + | |
- | // проверка качества имени - имя должно быть только из русских букв | + | |
- | var x: | + | |
- | test_str: | + | |
- | begin | + | |
- | for x:=1 to length(name) do begin | + | |
- | if not (name[x] in [' | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | if length(test_str)< | + | |
- | result := false; | + | |
- | exit; | + | |
- | | + | |
- | for x:=1 to length(test_str) do begin | + | |
- | if not (test_str[x] in [' | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | + | ||
- | | + | |
- | end; | + | |
- | function process_authors(rubrika, | + | |
- | //link - номер статьи в основном списке (на листе " | + | |
- | var x: | + | |
- | temp: | + | |
- | mas: | + | |
- | ok: boolean; | + | |
- | begin | + | |
- | ok := true; | + | |
- | if authors='' | + | |
- | if pos(' | + | |
- | if pos(' | + | |
- | if pos(' | + | |
- | temp := copy (authors,1,5); | + | |
- | + | ||
- | | + | |
- | | + | |
- | + | ||
- | | + | |
- | | + | |
- | for x:=1 to length(authors) do begin // разбиваем строку на подстроки, | + | |
- | if authors[x]=' | + | |
- | + | ||
- | if (length(temp)> | + | |
- | | + | |
- | | + | |
- | | + | |
- | then mas.Add(temp); | + | |
- | temp: | + | |
- | end else temp: | + | |
- | | + | |
- | if (temp<>'' | + | |
- | (pos(' | + | |
- | (pos(' | + | |
- | (pos(' | + | |
- | then mas.Add(temp); | + | |
- | for x := 0 to mas.Count-1 do begin | + | |
- | setlength(auth_index, | + | |
- | if not check_name(mas[x]) then ok := false; | + | |
- | auth_index[auth_index_counter].name: | + | |
- | auth_index[auth_index_counter].index: | + | |
- | inc(auth_index_counter); | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | function detect_rubriks_group(rubrik_name: | + | |
- | var x: | + | |
- | n: integer; | + | |
- | results: integer; | + | |
- | begin | + | |
- | | + | |
- | for x:=1 to length(Rubriks_Groups)-1 do begin | + | |
- | if Rubriks_Groups[x].rubriks.Find(rubrik_name, | + | |
- | | + | |
- | | + | |
- | end | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | function detect_common_rubriks(i: | + | |
- | Const min_vol = 1; | + | |
- | | + | |
- | | + | |
- | | + | |
- | // при котором рубрика считается регулярной | + | |
- | var x: | + | |
- | | + | |
- | | + | |
- | begin | + | |
- | // Заполнить таблицу ссылок (all_volumes) для рубрики | + | |
- | FillChar(all_volumes, | + | |
- | for x := rubriks[i].index to rubriks[i].index+rubriks[i].count-1 do begin // прочесать все статьи для рубрики x | + | |
- | try | + | |
- | user_year := strtoint(articles[rubr_index[x].index].year); | + | |
- | user_vol := strtoint(articles[rubr_index[x].index].volume); | + | |
- | | + | |
- | user_year := 0; | + | |
- | user_vol := 0; | + | |
- | | + | |
- | if (user_year >= min_year) and (user_year <= max_year) and | + | |
- | | + | |
- | then begin | + | |
- | if all_volumes[user_year, | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | end; | + | |
- | for x:=min_year to max_year do begin | + | |
- | if all_volumes[x, | + | |
- | + | ||
- | detect_common_rubriks: | + | |
- | + | ||
- | | + | |
- | end; | + | |
- | detect_common_rubriks: | + | |
- | end; | + | |
- | begin | + | |
- | sort_articles; | + | |
- | Load_rubriks_groups; | + | |
- | // загрузить полный список статей | + | |
- | + | ||
- | auth_index_counter := 1; | + | |
- | rubr_index_counter := 1; | + | |
- | global_progress.Min: | + | |
- | global_progress.max: | + | |
- | global_progress.Position: | + | |
- | global_progress.Step: | + | |
- | if Assigned(IWorkbook) then | + | |
- | try | + | |
- | ISheet := IWorkbook.Worksheets.Item[' | + | |
- | if not simple_mode then begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | // | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | for x := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with Rubriks_type[x] do begin | + | |
- | | + | |
- | if (Values[x, 2] = ' | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | + | ||
- | // загрузить список синонимов рубрик | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | for x := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with Sinonims[x] do begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | try | + | |
- | for x:=1 to IWorkbook.Names.Count do begin | + | |
- | | + | |
- | end; | + | |
- | edt_volumes.Items.Clear; | + | |
- | edt_volumes.Sorted: | + | |
- | + | ||
- | + | ||
- | // загрузить лист " | + | |
- | IRange := ISheet.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | SetLength(Articles, | + | |
- | // загрузить массив статей | + | |
- | global_progress.StepIt; | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | for x:=1 to IRange.Rows.Count do begin | + | |
- | local_progress.StepIt; | + | |
- | with Articles[x] do begin | + | |
- | | + | |
- | | + | |
- | title := Values[x, 3]; | + | |
- | page := Values[x, 4]; | + | |
- | link := Values[x, 5]; | + | |
- | | + | |
- | year := Values[x, 7]; | + | |
- | end; | + | |
- | end; | + | |
- | with Articles[2] do begin | + | |
- | | + | |
- | if not simple_mode then begin | + | |
- | if not process_authors(rubrika, | + | |
- | | + | |
- | process_rubriks(rubrika, | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | global_progress.StepIt; | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | for x:=3 to IRange.Rows.Count do begin | + | |
- | | + | |
- | | + | |
- | with Articles[x] do begin | + | |
- | prevVolume := articles[x-1].volume; | + | |
- | prevStroka := stroka; | + | |
- | if not simple_mode then begin | + | |
- | if not process_authors(rubrika, | + | |
- | ShowMessageInLog(year, | + | |
- | | + | |
- | end; | + | |
- | stroka := Year + ' | + | |
- | if (stroka <> prevStroka) then begin // сменился блок без разделителя | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | ' | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | if (prevVolume = '' | + | |
- | | + | |
- | end; | + | |
- | last: | + | |
- | if prevStroka<>' | + | |
- | EmptyParam, | + | |
- | ' | + | |
- | | + | |
- | end; | + | |
- | if not simple_mode then begin | + | |
- | + | ||
- | // выгрузить инфу на лист ISheet_auth_index | + | |
- | outValues := VarArrayCreate([1, | + | |
- | for x:=1 to length(auth_index)-1 do begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | IRange:= ISheet_auth_index.Range[' | + | |
- | IRange.Value := outValues; | + | |
- | VarClear(outValues); | + | |
- | + | ||
- | global_progress.StepIt; | + | |
- | sort_articles; | + | |
- | + | ||
- | // выгрузить инфу на лист ISheet_rubr_index | + | |
- | outValues := VarArrayCreate([1, | + | |
- | for x:=1 to length(rubr_index)-1 do begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | IRange:= ISheet_rubr_index.Range[' | + | |
- | IRange.Value := outValues; | + | |
- | VarClear(outValues); | + | |
- | + | ||
- | global_progress.StepIt; | + | |
- | sort_articles; | + | |
- | + | ||
- | // построение списка уникальных авторов | + | |
- | IRange := ISheet_auth_index.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | + | ||
- | // то самое место, где жутко тормозит | + | |
- | vAuthor := Values[1, 1]; first:=1; // | + | |
- | statusbar1.simpletext: | + | |
- | authors_counter := 1; | + | |
- | + | ||
- | global_progress.StepIt; | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | for x:=2 to IRange.Rows.Count do begin // построить список авторов | + | |
- | local_progress.StepIt; | + | |
- | prevValue := vAuthor; | + | |
- | vAuthor := Values[x, 1]; | + | |
- | if (vartostr(vAuthor) <> vartostr(prevValue)) then begin // сменился блок | + | |
- | last := x-1; | + | |
- | | + | |
- | + | ||
- | | + | |
- | with authors[authors_counter] do begin | + | |
- | name := vartostr(prevValue); | + | |
- | index := first; | + | |
- | count := last-first+1; | + | |
- | triplet:= copy(stroka, | + | |
- | surname:= stroka; | + | |
- | | + | |
- | | + | |
- | first := x; | + | |
- | end; | + | |
- | end; | + | |
- | last := IRange.Rows.Count; | + | |
- | stroka: | + | |
- | + | ||
- | setlength(authors, | + | |
- | with authors[authors_counter] do begin | + | |
- | name := vartostr(vAuthor); | + | |
- | index := first; | + | |
- | count := last-first+1; | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | // | + | |
- | + | ||
- | // выгрузить инфу на лист ISheet_authors | + | |
- | outValues := VarArrayCreate([1, | + | |
- | for x:=1 to length(authors)-1 do begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | IRange:= ISheet_authors.Range[' | + | |
- | IRange.Value := outValues; | + | |
- | VarClear(outValues); | + | |
- | + | ||
- | sort_articles; | + | |
- | global_progress.StepIt; | + | |
- | + | ||
- | // построение списка уникальных рубрик | + | |
- | IRange := ISheet_rubr_index.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | + | ||
- | // загрузить индекс рубрик назад | + | |
- | global_progress.StepIt; | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | Setlength(Rubr_index, | + | |
- | for x := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with Rubr_index[x] do begin | + | |
- | name := Values[x, 1]; | + | |
- | index := Values[x, 2]; | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | vRubrika := Values[1, 1]; first:=1; // | + | |
- | statusbar1.simpletext: | + | |
- | rubriks_counter := 1; | + | |
- | + | ||
- | global_progress.StepIt; | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | for x:=2 to IRange.Rows.Count do begin // построить список рубрик | + | |
- | local_progress.StepIt; | + | |
- | prevValue := vRubrika; | + | |
- | vRubrika := Values[x, 1]; | + | |
- | if (vartostr(vRubrika) <> vartostr(prevValue)) then begin // сменился блок | + | |
- | last := x-1; | + | |
- | | + | |
- | | + | |
- | with rubriks[rubriks_counter] do begin | + | |
- | name := vartostr(prevValue); | + | |
- | index := first; | + | |
- | count := last-first+1; | + | |
- | common := detect_common_rubriks(rubriks_counter, | + | |
- | group_number := detect_rubriks_group(stroka); | + | |
- | | + | |
- | | + | |
- | first := x; | + | |
- | end; | + | |
- | end; | + | |
- | last := IRange.Rows.Count; | + | |
- | stroka: | + | |
- | // обработать последний элемент | + | |
- | setlength(rubriks, | + | |
- | with rubriks[rubriks_counter] do begin | + | |
- | name := vartostr(vRubrika); | + | |
- | index := first; | + | |
- | count := last-first+1; | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | // | + | |
- | + | ||
- | // выгрузить инфу на лист ISheet_rubriks | + | |
- | outValues := VarArrayCreate([1, | + | |
- | for x:=1 to length(rubriks)-1 do begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | + | ||
- | end; | + | |
- | IRange:= ISheet_rubriks.Range[' | + | |
- | IRange.Value := outValues; | + | |
- | VarClear(outValues); | + | |
- | + | ||
- | sort_articles; | + | |
- | global_progress.StepIt; | + | |
- | + | ||
- | // построение списка триплетов (трёхбуквенных комбинаций) | + | |
- | IRange := ISheet_authors.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | + | ||
- | vAuthor := Values[1, 4]; first:=1; // | + | |
- | statusbar1.simpletext: | + | |
- | triplet_counter: | + | |
- | + | ||
- | global_progress.StepIt; | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | for x:=2 to IRange.Rows.Count do begin // построить список триплетов | + | |
- | local_progress.StepIt; | + | |
- | prevValue := vAuthor; | + | |
- | vAuthor := Values[x, 4]; | + | |
- | if vartostr(vAuthor) <> vartostr(prevValue) then begin // сменился блок | + | |
- | last := x-1; | + | |
- | | + | |
- | + | ||
- | | + | |
- | with triplets[triplet_counter] do begin | + | |
- | triplet := vartostr(prevValue); | + | |
- | index := first; | + | |
- | count := last-first+1; | + | |
- | letter:= copy(stroka, | + | |
- | | + | |
- | | + | |
- | first := x; | + | |
- | end; | + | |
- | end; | + | |
- | last := IRange.Rows.Count; | + | |
- | stroka: | + | |
- | + | ||
- | setlength(triplets, | + | |
- | with triplets[triplet_counter] do begin | + | |
- | | + | |
- | index := first; | + | |
- | count := last-first+1; | + | |
- | | + | |
- | end; | + | |
- | // | + | |
- | + | ||
- | // выгрузить инфу на лист ISheet_triplet | + | |
- | outValues := VarArrayCreate([1, | + | |
- | for x:=1 to length(triplets)-1 do begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | IRange:= ISheet_triplet.Range[' | + | |
- | IRange.Value := outValues; | + | |
- | VarClear(outValues); | + | |
- | + | ||
- | sort_articles; | + | |
- | end; // simple_mode | + | |
- | global_progress.StepIt; | + | |
- | statusbar1.simpletext: | + | |
- | + | ||
- | local_progress.Position := local_progress.max; | + | |
- | edt_volumes.Sorted: | + | |
- | if edt_volumes.Items.Count> | + | |
- | //0: Value := ISheet.Cells.Item[2, | + | |
- | //1: Value := ISheet.Range[' | + | |
- | //2: Value := ISheet.Range[' | + | |
- | //3: Value := IWorkbook.Names.Item(' | + | |
- | // | + | |
- | finally | + | |
- | IRange := nil; | + | |
- | ISheet := nil; | + | |
- | ISheet_auth_index := nil; | + | |
- | ISheet_rubr_index := nil; | + | |
- | ISheet_authors := nil; | + | |
- | ISheet_rubriks := nil; | + | |
- | ISheet_triplet := nil; | + | |
- | IWorkBook.Save(0); | + | |
- | setlength(auth_index, | + | |
- | setlength(rubr_index, | + | |
- | setlength(authors, | + | |
- | setlength(rubriks, | + | |
- | setlength(triplets, | + | |
- | setlength(sinonims, | + | |
- | statusbar1.simpletext: | + | |
- | global_progress.StepIt; | + | |
- | end; | + | |
- | except | + | |
- | raise Exception.Create(' | + | |
- | end; | + | |
- | local_progress.Position := local_progress.Max; | + | |
- | global_progress.Position := global_progress.Max; | + | |
- | end; | + | |
- | + | ||
- | Procedure TForm1.sort_articles; | + | |
- | var ISheet: Excel8TLB._Worksheet; | + | |
- | begin | + | |
- | if Assigned(IWorkbook) then begin | + | |
- | | + | |
- | try | + | |
- | try | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | true, true, | + | |
- | | + | |
- | finally | + | |
- | | + | |
- | | + | |
- | | + | |
- | raise Exception.Create(' | + | |
- | | + | |
- | + | ||
- | if not simple_mode then begin | + | |
- | | + | |
- | try | + | |
- | try | + | |
- | | + | |
- | | + | |
- | xlNo, EmptyParam, EmptyParam, | + | |
- | | + | |
- | true, true, | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | raise Exception.Create(' | + | |
- | | + | |
- | + | ||
- | | + | |
- | try | + | |
- | try | + | |
- | | + | |
- | | + | |
- | xlNo, EmptyParam, EmptyParam, | + | |
- | | + | |
- | true, true, | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | raise Exception.Create(' | + | |
- | | + | |
- | + | ||
- | + | ||
- | | + | |
- | try | + | |
- | try | + | |
- | | + | |
- | | + | |
- | xlNo, EmptyParam, EmptyParam, | + | |
- | | + | |
- | true, true, | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | raise Exception.Create(' | + | |
- | | + | |
- | + | ||
- | | + | |
- | try | + | |
- | try | + | |
- | | + | |
- | | + | |
- | xlNo, EmptyParam, EmptyParam, | + | |
- | | + | |
- | true, true, | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | raise Exception.Create(' | + | |
- | | + | |
- | + | ||
- | + | ||
- | end; // simple_mode | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.Load_complex_rubriks; | + | |
- | var Values: OLEVariant; | + | |
- | ISheet: Excel8TLB._Worksheet; | + | |
- | IRange: Excel8TLB.Range; | + | |
- | i: integer; | + | |
- | begin | + | |
- | // загрузить список сборных рубрик | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | // | + | |
- | | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | Rubriki.Add(Values[i, | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | + | ||
- | {заполняет структуру Rubriks_groups на основе информации с листа " | + | |
- | procedure TForm1.Load_rubriks_groups; | + | |
- | var Values: OLEVariant; | + | |
- | ISheet: Excel8TLB._Worksheet; | + | |
- | IRange: Excel8TLB.Range; | + | |
- | i,j: integer; | + | |
- | temp_str: string; | + | |
- | begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | for i := 1 to IRange.Columns.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with Rubriks_groups[i] do begin | + | |
- | group := Values[1, | + | |
- | | + | |
- | | + | |
- | for j:=2 to IRange.Rows.Count do begin // загрузить рубрики | + | |
- | temp_str := Values[j, | + | |
- | if (temp_str <> '' | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.Local_Content_Create(Sender: | + | |
- | var year_vol: | + | |
- | x: | + | |
- | year, load_year_vol: | + | |
- | | + | |
- | var Values: OLEVariant; | + | |
- | | + | |
- | | + | |
- | i,j: integer; | + | |
- | | + | |
- | | + | |
- | try | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | with VolumeContent[i-1] do begin | + | |
- | rubrika := Values[i, 1]; | + | |
- | author := Values[i, 2]; | + | |
- | title := Values[i, 3]; | + | |
- | page := Values[i, 4]; | + | |
- | link := Values[i, 5]; | + | |
- | volume := Values[i, 6]; | + | |
- | year := Values[i, 7]; | + | |
- | used_as_slave := false; | + | |
- | for j:=1 to max_complex_rubriks do used_as_article[j] := false; | + | |
- | stroka:= format(' | + | |
- | | + | |
- | | + | |
- | finally | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | begin | + | |
- | if Assigned(IWorkbook) then begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | for x:=0 to edt_volumes.Items.Count-1 do begin | + | |
- | AllContent: | + | |
- | local_progress.StepIt; | + | |
- | load_year_vol: | + | |
- | year_vol: | + | |
- | year := copy(year_vol, | + | |
- | if (year_vol = ' | + | |
- | statusbar1.simpletext: | + | |
- | fileDJVU_Bookmarks: | + | |
- | LoadContent(load_year_vol); | + | |
- | MakeContent; | + | |
- | ExportHTML(make_single); | + | |
- | fileDJVU_Bookmarks.CopyFrom(AllContent, | + | |
- | fileDJVU_Bookmarks.Free; | + | |
- | AllContent.Free; | + | |
- | | + | |
- | end; | + | |
- | statusbar1.simpletext: | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.CreateBatches; | + | |
- | var bat_file: TStringList; | + | |
- | sed_path: string; | + | |
- | x: | + | |
- | year, year_vol: string; | + | |
- | function test_path: | + | |
- | var x: | + | |
- | results: | + | |
- | begin | + | |
- | results := true; | + | |
- | for x:=1 to length(prog_path) do begin | + | |
- | if (prog_path[x] in [' | + | |
- | | + | |
- | results := false; | + | |
- | break; | + | |
- | | + | |
- | end; | + | |
- | test_path := results; | + | |
- | end; | + | |
- | begin | + | |
- | if not test_path then begin | + | |
- | Application.MessageBox( | + | |
- | ' | + | |
- | ' | + | |
- | ' | + | |
- | MB_OK); | + | |
- | end; | + | |
- | bat_file: | + | |
- | + | ||
- | // !insert_bookmarks.bat | + | |
- | + | ||
- | for x:=0 to edt_volumes.Items.Count-1 do begin | + | |
- | | + | |
- | year := copy(year_vol, | + | |
- | if (year_vol = ' | + | |
- | | + | |
- | end; | + | |
- | bat_file.SaveToFile(prog_path+' | + | |
- | + | ||
- | // !insert_one.bat | + | |
- | + | ||
- | bat_file.Clear; | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.SaveToFile(prog_path+' | + | |
- | + | ||
- | // !do_all.bat | + | |
- | + | ||
- | bat_file.Clear; | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.SaveToFile(prog_path+' | + | |
- | + | ||
- | // !Process_one.bat | + | |
- | + | ||
- | bat_file.Clear; | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add('" | + | |
- | ' | + | |
- | ' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | + | ||
- | // вычислить строку для коррекции ссылок внутри DJVU - коррекция бага Acrobat' | + | |
- | sed_path := prog_path; | + | |
- | sed_path: | + | |
- | sed_path: | + | |
- | sed_path: | + | |
- | sed_path: | + | |
- | + | ||
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.Add(' | + | |
- | bat_file.SaveToFile(prog_path+' | + | |
- | bat_file.Free; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.ShowTree; | + | |
- | var i: integer; | + | |
- | srcNode: | + | |
- | stroka: | + | |
- | begin | + | |
- | tree_preview.Items.Clear; | + | |
- | tree_preview.Items: | + | |
- | srcNode: | + | |
- | while srcNode <> nil do begin | + | |
- | if pos(' | + | |
- | i: | + | |
- | | + | |
- | i := strToInt(copy(SrcNode.Text, | + | |
- | | + | |
- | if (VolumeContent[i].rubrika <> '' | + | |
- | if (VolumeContent[i].author <> '' | + | |
- | if (VolumeContent[i].title <> '' | + | |
- | if length(stroka)> | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.MakeContent; | + | |
- | var i,y: integer; | + | |
- | Node, lastNode: | + | |
- | stroka, stroka_spec: | + | |
- | special_rubrika, | + | |
- | other_rubriks: | + | |
- | pos_found: | + | |
- | + | ||
- | | + | |
- | // собирает все подчинённые статьи (подвёрстки) для данной мастер-статьи | + | |
- | // на входе - узел мастер-статьи и мастер-ссылка | + | |
- | var x: | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | master_flag: | + | |
- | stroka: | + | |
- | counter: | + | |
- | Delete(stroka, | + | |
- | stroka:= ' | + | |
- | for x:=0 to length(VolumeContent)-1 do begin | + | |
- | with VolumeContent[x] do begin | + | |
- | if link = master_link then inc(counter); | + | |
- | if link = stroka then begin // найден соответсвующий слэйв | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | end; | + | |
- | // получить номер статьи для вывода сообщения | + | |
- | if pos(' | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | if master_flag then begin // проверка на " | + | |
- | with VolumeContent[article_number] do begin | + | |
- | ShowMessageInLog(year, | + | |
- | | + | |
- | end; | + | |
- | if counter<> | + | |
- | with VolumeContent[article_number] do begin | + | |
- | ShowMessageInLog(year, | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | + | ||
- | | + | |
- | // собирает все статьи из сборной рубрики | + | |
- | // на входе - узел главной статьи и имя сборной рубрики | + | |
- | var x: | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | rubr_position := 0; | + | |
- | for x:=0 to length(VolumeContent)-1 do begin | + | |
- | with VolumeContent[x] do begin | + | |
- | if compare_rubriks(rubrika,root_rubrika, | + | |
- | | + | |
- | | + | |
- | if (link='' | + | |
- | master: | + | |
- | end else begin | + | |
- | stroka: | + | |
- | master: | + | |
- | | + | |
- | if master then connect_slaves(lastNode, | + | |
- | end; | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | { | + | |
- | Нужно модифицировать алгоритм сборки оглавления: | + | |
- | статья, | + | |
- | => признак used_as_article недостаточен для решения. | + | |
- | нужен массив флагов для всех сборных рубрик " | + | |
- | + | ||
- | Для того, чтобы не делать массив флагов зависимым от списка сборных рубрик, | + | |
- | надо использовать принцип - " | + | |
- | ограничить количество контролируемых сборных рубрик, | + | |
- | + | ||
- | used_as_article: | + | |
- | for i:=0 to 5 do used_as_slave[i]: | + | |
- | used_as_article[0] - использована как обычная статья (не из сборных рубрик) | + | |
- | used_as_article[1] - использована как статья первой спецрубрики и т.д. | + | |
- | + | ||
- | } | + | |
- | begin | + | |
- | single_volume_tree.Items.Clear; | + | |
- | Node: | + | |
- | for i:=0 to length(VolumeContent)-1 do begin | + | |
- | with VolumeContent[i] do begin | + | |
- | // определить мастер/ | + | |
- | if (link='' | + | |
- | | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | // Узнать, | + | |
- | special_rubrika: | + | |
- | for y:=0 to Rubriki.Count-1 do begin | + | |
- | if compare_rubriks(rubrika, | + | |
- | special_rubrika: | + | |
- | // проверить, | + | |
- | if not used_as_article[pos_found] then begin | + | |
- | | + | |
- | | + | |
- | end else begin pos_found: | + | |
- | | + | |
- | end; | + | |
- | // на выходе - признак, | + | |
- | // stroka_spec - только для случая, | + | |
- | // pos_found - тоже только тогда, когда найдена неиспользованная рубрика | + | |
- | if special_rubrika then begin | + | |
- | // | + | |
- | if pos_found > 0 then begin | + | |
- | if not used_as_article[pos_found] then begin // спецрубрики строятся даже по слэйвам (обложки, | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | end else begin | + | |
- | if not (used_as_article[1]) and not (used_as_slave) and not slave then begin | + | |
- | lastNode: | + | |
- | used_as_article[1]: | + | |
- | if master then connect_slaves(lastNode, | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | end; | + | |
- | // проверка на " | + | |
- | for i:=0 to length(VolumeContent)-1 do begin | + | |
- | with VolumeContent[i] do begin | + | |
- | if (link='' | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | if not (used_as_slave) and slave then begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | function TForm1.compare_rubriks(rubriki, | + | |
- | // | + | |
- | // | + | |
- | // возвращает other_rubriks - набор рубрик без искомой рубрики (разделитель " | ") | + | |
- | // возвращает pos_found - порядковый номер найденной рубрики в наборе рубрик | + | |
- | var temp: | + | |
- | position: | + | |
- | counter: | + | |
- | begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | if rubriki=test_string then begin result: | + | |
- | if Pos(' | + | |
- | + | ||
- | | + | |
- | + | ||
- | | + | |
- | | + | |
- | position: | + | |
- | if position> | + | |
- | | + | |
- | | + | |
- | | + | |
- | if temp=test_string | + | |
- | then begin // рубрика обнаружена | + | |
- | | + | |
- | | + | |
- | end else begin // записать найденную рубрику в список " | + | |
- | if other_rubriks='' | + | |
- | then other_rubriks: | + | |
- | else other_rubriks: | + | |
- | end; | + | |
- | end; | + | |
- | until position=0; | + | |
- | | + | |
- | | + | |
- | if temp=test_string | + | |
- | then begin // рубрика обнаружена | + | |
- | | + | |
- | | + | |
- | end else begin // записать найденную рубрику в список " | + | |
- | if other_rubriks='' | + | |
- | then other_rubriks: | + | |
- | else other_rubriks: | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.ExportHTML(all: | + | |
- | var oldLevel: | + | |
- | curNode: | + | |
- | x, y: integer; | + | |
- | pos_found: | + | |
- | file_content_name: | + | |
- | special_rubrika: | + | |
- | stroka, | + | |
- | Flags: OLEVariant; | + | |
- | One_Volume_Content: | + | |
- | article_number: | + | |
- | rubrika_name: | + | |
- | year_vol_str, | + | |
- | CurElement : ContentElement; | + | |
- | begin | + | |
- | curNode: | + | |
- | oldLevel: | + | |
- | One_Volume_Content := TStringList.Create; | + | |
- | if all then begin | + | |
- | with VolumeContent[1] do begin | + | |
- | if (year = ' | + | |
- | | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | One_Volume_Content.Add(format('< | + | |
- | if FileExists(prog_path+format(' | + | |
- | then One_Volume_Content.Add(format('< | + | |
- | else One_Volume_Content.Add(format('< | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | end; | + | |
- | while curNode <> nil do begin | + | |
- | if oldLevel< | + | |
- | for x:=1 to curNode.Level-oldLevel do begin | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | if oldLevel> | + | |
- | for x:=1 to oldLevel-curNode.Level do begin | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | // тут будет передаваться инфа о том, какая рубрика в данной статье является сборной. | + | |
- | // передаваться в виде s1 (s2, s3, s4, s5 и т.д.) | + | |
- | if pos(' | + | |
- | article_number := StrToInt(curNode.Text); | + | |
- | rubrika_name : | + | |
- | end else begin | + | |
- | article_number := strToInt(copy(CurNode.Text, | + | |
- | rubrika_name := copy(CurNode.Text, | + | |
- | | + | |
- | with VolumeContent[article_number] do begin | + | |
- | CurElement := ContentElement.Create(rubrika, | + | |
- | if (year = ' | + | |
- | | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | if rubrika_name <> '' | + | |
- | | + | |
- | | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | end; | + | |
- | if chk_debug_mode.Checked then begin // режим вывода отладочного оглавления | + | |
- | if special_rubrika and (curNode.Level=0) then begin | + | |
- | stroka: | + | |
- | end else begin; // вывести всю инфу по ссылке | + | |
- | stroka: | + | |
- | if (rubrika <> '' | + | |
- | if (author <> '' | + | |
- | if (title <> '' | + | |
- | if stroka = '' | + | |
- | if (link <> '' | + | |
- | then stroka := stroka + ' | + | |
- | else stroka := stroka + ' | + | |
- | | + | |
- | end else begin // обычный режим вывода оглавления | + | |
- | if all then begin // вывод сборного оглавления | + | |
- | if special_rubrika then begin // спецрубрика | + | |
- | if (curNode.Level=0) then // спецрубрика в корне | + | |
- | stroka: | + | |
- | else begin // статья в спецрубрике | + | |
- | if stroka_spec <> rubrika then begin // статья со сложносочинённой рубрикой | + | |
- | if (author='' | + | |
- | if (title='' | + | |
- | then stroka: | + | |
- | else stroka: | + | |
- | end else begin | + | |
- | if (title='' | + | |
- | then stroka: | + | |
- | else stroka: | + | |
- | | + | |
- | end else begin | + | |
- | if (author='' | + | |
- | if (title='' | + | |
- | then stroka: | + | |
- | else stroka: | + | |
- | end else begin | + | |
- | if (title='' | + | |
- | then stroka: | + | |
- | else stroka: | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | end else begin // обычная рубрика | + | |
- | if (rubrika='' | + | |
- | if (author='' | + | |
- | if (title='' | + | |
- | else stroka: | + | |
- | end else begin | + | |
- | if (title='' | + | |
- | else stroka: | + | |
- | end; | + | |
- | end else begin // есть название | + | |
- | if (author='' | + | |
- | if (title='' | + | |
- | else stroka: | + | |
- | end else begin | + | |
- | if (title='' | + | |
- | else stroka: | + | |
- | end; | + | |
- | | + | |
- | end; | + | |
- | end else begin // вывод оглавления для одного номера | + | |
- | if special_rubrika then begin // спецрубрика | + | |
- | if (curNode.Level=0) then // спецрубрика в корне | + | |
- | stroka: | + | |
- | else begin // статья в спецрубрике | + | |
- | if stroka_spec <> rubrika then begin // статья со сложносочинённой рубрикой | + | |
- | if (author='' | + | |
- | if (title='' | + | |
- | then stroka: | + | |
- | else stroka: | + | |
- | end else begin | + | |
- | if (title='' | + | |
- | then stroka: | + | |
- | else stroka: | + | |
- | | + | |
- | end else begin | + | |
- | if (author='' | + | |
- | if (title='' | + | |
- | then stroka: | + | |
- | else stroka: | + | |
- | end else begin | + | |
- | if (title='' | + | |
- | then stroka: | + | |
- | else stroka: | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | end else begin // обычная рубрика | + | |
- | if (rubrika='' | + | |
- | if (author='' | + | |
- | if (title='' | + | |
- | else stroka: | + | |
- | end else begin | + | |
- | if (title='' | + | |
- | else stroka: | + | |
- | end; | + | |
- | end else begin // есть название рубрики | + | |
- | if (author='' | + | |
- | if (title='' | + | |
- | else stroka: | + | |
- | end else begin | + | |
- | if (title='' | + | |
- | else stroka: | + | |
- | end; | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | end; | + | |
- | if all | + | |
- | then stroka: | + | |
- | else stroka: | + | |
- | One_Volume_Content.Add(stroka); | + | |
- | CurElement.Free; | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | for x:=1 to oldLevel+1 do begin // проставить завершающие </ | + | |
- | | + | |
- | end; | + | |
- | //if all then begin | + | |
- | | + | |
- | {end else begin | + | |
- | | + | |
- | | + | |
- | // открыть созданный Html во встроенном редакторе | + | |
- | Flags := 0; | + | |
- | | + | |
- | if chk_embed_bookmarks.Checked then begin | + | |
- | ShellExecute(GetDesktopWindow(), | + | |
- | PChar(file_content_name + ' ' + edt_volumes.Items[edt_volumes.ItemIndex] + '.djvu ' + edt_volumes.Items[edt_volumes.ItemIndex] + ' | + | |
- | nil, SW_HIDE); | + | |
- | | + | |
- | end; } | + | |
- | One_Volume_Content.Free; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.CreateTOC; | + | |
- | // используется инфа из edt_volumes | + | |
- | // результат записывается в file_Global_Volumes_Content | + | |
- | Const min_vol = 1; | + | |
- | max_vol = 12; | + | |
- | test_vol = max_vol + 1; | + | |
- | var MyContentTOC: | + | |
- | x, | + | |
- | user_year, user_vol: | + | |
- | str_vol, img_vol: string; | + | |
- | style: | + | |
- | all_volumes: | + | |
- | djvu_name: | + | |
- | year_vol_str: | + | |
- | begin | + | |
- | MyContentTOC: | + | |
- | FillChar(all_volumes, | + | |
- | for x := 0 to edt_volumes.Items.Count-1 do begin // загрузить инфу по номерам и годам | + | |
- | try | + | |
- | user_year := StrToInt(copy(edt_volumes.Items[x], | + | |
- | user_vol := StrToInt(copy(edt_volumes.Items[x], | + | |
- | | + | |
- | ShowMessageInLog(' | + | |
- | | + | |
- | if (user_year >= min_year) and (user_year <= max_year) and | + | |
- | | + | |
- | then begin | + | |
- | all_volumes[user_year, | + | |
- | all_volumes[user_year, | + | |
- | | + | |
- | end; | + | |
- | // Создать заголовок | + | |
- | MyContentTOC.Add('< | + | |
- | MyContentTOC.Add(format('< | + | |
- | if chk_debug_mode.Checked then begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | // создать оглавление первого уровня (таблица номеров) | + | |
- | MyContentTOC.Add('< | + | |
- | MyContentTOC.Add('< | + | |
- | for y := min_vol to max_vol do begin | + | |
- | if y<10 | + | |
- | then MyContentTOC.Add(format('< | + | |
- | else MyContentTOC.Add(format('< | + | |
- | end; | + | |
- | MyContentTOC.Add('</ | + | |
- | for x := max_year downto min_year do begin | + | |
- | if (x mod 2) = 0 then style := ' | + | |
- | if all_volumes[x, | + | |
- | then MyContentTOC.Add(format('< | + | |
- | else MyContentTOC.Add(format('< | + | |
- | for y := min_vol to max_vol do begin | + | |
- | if y<10 | + | |
- | then year_vol_str := format(' | + | |
- | else year_vol_str := format(' | + | |
- | if (year_vol_str = ' | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | if (x = 1992) and (y = 6) and (all_volumes[x, | + | |
- | + | ||
- | if all_volumes[x, | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | if (chk_debug_mode.checked) and (fileexists(djvu_name)) // в режиме проверки для имеющихся в DJVU номеров создавать ссылки в таблице номеров | + | |
- | then MyContentTOC.Add(format('< | + | |
- | else MyContentTOC.Add('< | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | MyContentTOC.Add('</ | + | |
- | + | ||
- | // создать оглавление второго уровня (годовые подшивки) | + | |
- | MyContentTOC.Add('< | + | |
- | year_count: | + | |
- | for x:=max_year downto min_year do begin | + | |
- | if all_volumes[x, | + | |
- | inc(year_count); | + | |
- | if (year_count mod 2) = 1 | + | |
- | then MyContentTOC.Add(format('< | + | |
- | else MyContentTOC.Add(format('< | + | |
- | for y:=min_vol to max_vol do begin | + | |
- | if y=7 then MyContentTOC.Add('< | + | |
- | if (x = 1992) and (y = 6) and (all_volumes[x, | + | |
- | if all_volumes[x, | + | |
- | if y<10 | + | |
- | then year_vol_str := format(' | + | |
- | else year_vol_str := format(' | + | |
- | + | ||
- | if y < 10 then str_vol := format(' | + | |
- | + | ||
- | if (year_vol_str = ' | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | if FileExists(format(' | + | |
- | then img_vol := format(' | + | |
- | else img_vol: | + | |
- | MyContentTOC.Add(format( | + | |
- | '< | + | |
- | '< | + | |
- | '< | + | |
- | | + | |
- | end else begin // номера нет - вывести затычку | + | |
- | if y < 10 then str_vol := format(' | + | |
- | img_vol := ' | + | |
- | MyContentTOC.Add(format( | + | |
- | '< | + | |
- | '< | + | |
- | '& | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | end; | + | |
- | MyContentTOC.Add('</ | + | |
- | MyContentTOC.SaveToStream(file_Global_Volumes_Content); | + | |
- | MyContentTOC.Free; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.Global_Content_Create(Sender: | + | |
- | Procedure per_volumes; | + | |
- | var Values: OLEVariant; | + | |
- | ISheet: Excel8TLB._Worksheet; | + | |
- | IRange: Excel8TLB.Range; | + | |
- | i,z,j: integer; | + | |
- | Flags: OLEVariant; | + | |
- | begin | + | |
- | if Assigned(IWorkbook) then | + | |
- | //try | + | |
- | ISheet := IWorkbook.Worksheets.Item[' | + | |
- | file_Global_Volumes_Content: | + | |
- | AllContent: | + | |
- | tree_preview.items.Clear; | + | |
- | try | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | for z: | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | with VolumeContent[i-1] do begin | + | |
- | rubrika := Values[i, 1]; | + | |
- | author := Values[i, 2]; | + | |
- | title := Values[i, 3]; | + | |
- | page := Values[i, 4]; | + | |
- | link := Values[i, 5]; | + | |
- | volume := Values[i, 6]; | + | |
- | year := Values[i, 7]; | + | |
- | used_as_slave := false; | + | |
- | for j :=1 to max_complex_rubriks do used_as_article[j] := false; | + | |
- | //stroka:= format(' | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | local_progress.StepIt; | + | |
- | CreateTOC; | + | |
- | local_progress.Position: | + | |
- | file_Global_Volumes_Content.CopyFrom(AllContent, | + | |
- | finally | + | |
- | IRange := nil; | + | |
- | ISheet := nil; | + | |
- | AllContent.Free; | + | |
- | file_Global_Volumes_Content.Free; | + | |
- | tree_preview.Items.Clear; | + | |
- | single_volume_tree.Items.Clear; | + | |
- | // открыть созданный Html во встроенном редакторе | + | |
- | Flags := 0; | + | |
- | html_preview.Navigate(WideString(prog_path+' | + | |
- | end; | + | |
- | //except | + | |
- | //raise Exception.Create(' | + | |
- | //end; | + | |
- | end; | + | |
- | Procedure per_authors; | + | |
- | // type all_triplets_element: | + | |
- | var Values: OLEVariant; | + | |
- | ISheet, ISheet_auth_index, | + | |
- | articles: array of TMyContent; | + | |
- | auth_index: | + | |
- | authors: array of authors_element; | + | |
- | triplets: array of triplets_element; | + | |
- | odd_even: | + | |
- | min_tripl, max_tripl: integer; // индексы для простановки диапазонов триплетов | + | |
- | toc_triplets: | + | |
- | prevIndex, page_counter, | + | |
- | + | ||
- | vYear, vMonth, vAuthor, prevValue, vRubrika: OLEVariant; | + | |
- | x, | + | |
- | stroka, prevStroka: | + | |
- | auth_index_counter, | + | |
- | authors_counter, | + | |
- | triplet_counter: | + | |
- | Authors_TOC: | + | |
- | Authors_Names: | + | |
- | Authors_Articles: | + | |
- | IRange: Excel8TLB.Range; | + | |
- | i,j,z: integer; | + | |
- | Flags: OLEVariant; | + | |
- | year_vol_str, | + | |
- | + | ||
- | begin | + | |
- | if Assigned(IWorkbook) then | + | |
- | try | + | |
- | ISheet := IWorkbook.Worksheets.Item[' | + | |
- | ISheet_auth_index := IWorkbook.Worksheets.Item[' | + | |
- | ISheet_authors := IWorkbook.Worksheets.Item[' | + | |
- | ISheet_triplet := IWorkbook.Worksheets.Item[' | + | |
- | + | ||
- | Authors_TOC := TStringList.Create; | + | |
- | Authors_Names := TStringList.Create; | + | |
- | Authors_Articles := TStringList.Create; | + | |
- | + | ||
- | file_All_Authors_Index: | + | |
- | try | + | |
- | // создать конечный перечень - имя автора (заголовок, | + | |
- | + | ||
- | // загрузить лист | + | |
- | IRange := ISheet.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | SetLength(Articles, | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with Articles[i] do begin | + | |
- | | + | |
- | | + | |
- | title := Values[i, 3]; | + | |
- | page := Values[i, 4]; | + | |
- | link := Values[i, 5]; | + | |
- | | + | |
- | year := Values[i, 7]; | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | // загрузить лист " | + | |
- | IRange := ISheet_auth_index.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | Setlength(auth_index, | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with auth_index[i] do begin | + | |
- | name := Values[i, 1]; | + | |
- | index := Values[i, 2]; | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | // загрузить лист " | + | |
- | IRange := ISheet_authors.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | Setlength(authors, | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with authors[i] do begin | + | |
- | name := Values[i, 1]; | + | |
- | index := Values[i, 2]; | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | // загрузить лист " | + | |
- | IRange := ISheet_triplet.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | Setlength(triplets, | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with triplets[i] do begin | + | |
- | | + | |
- | index := Values[i, 2]; | + | |
- | | + | |
- | | + | |
- | if not (letter[1] in [' | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | Authors_TOC.add('< | + | |
- | Authors_TOC.add('< | + | |
- | // построить список всех триплетов | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | x:=0; | + | |
- | // | + | |
- | // загрузить массив триплетов | + | |
- | for i:= ord(' | + | |
- | for x:=0 to max_toc_triplet do begin | + | |
- | toc_triplets[i, | + | |
- | | + | |
- | end; | + | |
- | { найти диапазон для очередной буквы | + | |
- | по найденному диапазону триплетов построить 8 интервалов | + | |
- | если кол-во триплетов меньше или равно max_toc_triplet | + | |
- | если кол-во триплетов больше max_toc_triplet - " | + | |
- | приписать триплетам соостветствующие индексы интервалов | + | |
- | } | + | |
- | first:=1; prevStroka: | + | |
- | for i := 1 to length(triplets)-1 do begin | + | |
- | if (prevStroka <> triplets[i].letter) then begin // пошла новая буква | + | |
- | last:=i-1; // конец диапазона - предыдущий триплет | + | |
- | toc_triplets[ord(prevStroka[1]), | + | |
- | if (last-first+1)< | + | |
- | for x:=1 to last-first+1 do begin | + | |
- | toc_triplets[ord(prevStroka[1]), | + | |
- | triplets[first+x-1].toc_triplets_index: | + | |
- | | + | |
- | end else begin // хитрый алгоритм | + | |
- | for x:=1 to max_toc_triplet do begin | + | |
- | min_tripl: | + | |
- | max_tripl: | + | |
- | for z: | + | |
- | | + | |
- | end; | + | |
- | if min_tripl = max_tripl | + | |
- | then toc_triplets[ord(prevStroka[1]), | + | |
- | else toc_triplets[ord(prevStroka[1]), | + | |
- | | + | |
- | end; | + | |
- | first:=i; // запомнить начало нового диапазона | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | i: | + | |
- | last:=i-1; // конец диапазона - последний элемент | + | |
- | toc_triplets[ord(prevStroka[1]), | + | |
- | if (last-first+1)< | + | |
- | for x:=1 to last-first+1 do begin | + | |
- | toc_triplets[ord(prevStroka[1]), | + | |
- | triplets[first+x-1].toc_triplets_index: | + | |
- | | + | |
- | end else begin // хитрый алгоритм | + | |
- | for x:=1 to max_toc_triplet do begin | + | |
- | min_tripl: | + | |
- | max_tripl: | + | |
- | for z: | + | |
- | | + | |
- | end; | + | |
- | if min_tripl = max_tripl | + | |
- | then toc_triplets[ord(prevStroka[1]), | + | |
- | else toc_triplets[ord(prevStroka[1]), | + | |
- | | + | |
- | end; | + | |
- | odd_even := true; | + | |
- | Authors_TOC.add('< | + | |
- | Authors_TOC.Add('< | + | |
- | for i:= ord(' | + | |
- | if toc_triplets[i, | + | |
- | | + | |
- | if odd_even | + | |
- | then Authors_TOC.Add('< | + | |
- | else Authors_TOC.Add('< | + | |
- | for x:=1 to max_toc_triplet do begin | + | |
- | if (toc_triplets[i, | + | |
- | then Authors_TOC.Add(format('< | + | |
- | else Authors_TOC.Add('< | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | Authors_TOC.Add('</ | + | |
- | + | ||
- | // построить список всех фамилий | + | |
- | Authors_Names.add('< | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step := 1; | + | |
- | statusbar1.simpletext := ' | + | |
- | z := 0; | + | |
- | page_counter := 0; | + | |
- | odd_even := false; | + | |
- | i := 1; prevStroka := triplets[i].letter + ' | + | |
- | Authors_Names.Add(format('< | + | |
- | inc(page_counter, | + | |
- | Authors_Names.Add('< | + | |
- | for i:= 1 to length(triplets)-1 do begin | + | |
- | if (prevStroka <> triplets[i].letter + ' | + | |
- | for x:=z to 2 do begin | + | |
- | | + | |
- | end; | + | |
- | Authors_Names.Add('</ | + | |
- | if (page_counter> | + | |
- | z := 0; | + | |
- | | + | |
- | | + | |
- | | + | |
- | end else | + | |
- | | + | |
- | inc(page_counter, | + | |
- | rows_counter := 0; | + | |
- | Authors_Names.Add('< | + | |
- | z := 0; | + | |
- | odd_even: | + | |
- | | + | |
- | for x := triplets[i].index to (triplets[i].index + triplets[i].count - 1) do begin // вывести все фамилии для триплета | + | |
- | if z = 3 then begin // запустить | + | |
- | | + | |
- | | + | |
- | z := 0; | + | |
- | if odd_even | + | |
- | then Authors_Names.Add('</ | + | |
- | else Authors_Names.Add('</ | + | |
- | | + | |
- | end; | + | |
- | if (page_counter> | + | |
- | | + | |
- | z := 0; | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | inc(z); | + | |
- | Authors_Names.Add(format('< | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | Authors_Names.Add('</ | + | |
- | + | ||
- | // построить список нижнего уровня | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | Authors_Articles.add('< | + | |
- | for i := 1 to length(authors)-1 do begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | for x: | + | |
- | with articles[auth_index[x].index] do begin | + | |
- | + | ||
- | if (year = ' | + | |
- | year_vol_str := ' | + | |
- | str_vol := ' | + | |
- | end else begin | + | |
- | year_vol_str := year + ' | + | |
- | str_vol := volume; | + | |
- | | + | |
- | + | ||
- | | + | |
- | if (rubrika <> '' | + | |
- | if (author <> '' | + | |
- | if (title <> '' | + | |
- | | + | |
- | + | ||
- | | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | Authors_Articles.add('</ | + | |
- | statusbar1.simpletext: | + | |
- | + | ||
- | Authors_TOC.SaveToStream(file_All_Authors_Index); | + | |
- | Authors_Names.SaveToStream(file_All_Authors_Index); | + | |
- | Authors_Articles.SaveToStream(file_All_Authors_Index); | + | |
- | finally | + | |
- | IRange := nil; | + | |
- | ISheet := nil; | + | |
- | ISheet_auth_index := nil; | + | |
- | ISheet_authors := nil; | + | |
- | ISheet_triplet := nil; | + | |
- | setlength(articles, | + | |
- | setlength(auth_index, | + | |
- | setlength(authors, | + | |
- | setlength(triplets, | + | |
- | file_All_Authors_Index.Free; | + | |
- | Authors_TOC.Free; | + | |
- | Authors_Names.Free; | + | |
- | Authors_Articles.Free; | + | |
- | { | + | |
- | // открыть созданный Html во встроенном редакторе | + | |
- | Flags := 0; | + | |
- | html_preview.Navigate(WideString(prog_path+' | + | |
- | } | + | |
- | end; | + | |
- | except | + | |
- | raise Exception.Create(' | + | |
- | end; | + | |
- | end; | + | |
- | Procedure per_rubrics; | + | |
- | var Values: OLEVariant; | + | |
- | ISheet, ISheet_rubr_index, | + | |
- | articles: array of TMyContent; | + | |
- | rubr_index: array of rubr_index_element; | + | |
- | rubriks: array of rubriks_element; | + | |
- | + | ||
- | Sorted_rubriks: | + | |
- | Rubrik_Object: | + | |
- | + | ||
- | odd_even: | + | |
- | page_counter, | + | |
- | x: | + | |
- | user_max_year, | + | |
- | stroka: | + | |
- | Rubriks_TOC: | + | |
- | Rubriks_Names: | + | |
- | Rubriks_Articles: | + | |
- | IRange: Excel8TLB.Range; | + | |
- | i,z: integer; | + | |
- | year_vol_str, | + | |
- | prev_group: integer; | + | |
- | procedure show_table_rubrik(i: | + | |
- | Const min_vol = 1; | + | |
- | | + | |
- | | + | |
- | var x, | + | |
- | | + | |
- | | + | |
- | | + | |
- | // если рубрики в номере нет, то значение равно нулю, | + | |
- | // в противном случае - это номер страницы | + | |
- | // последний столбец - количество номеров с рубриками в определённом | + | |
- | begin | + | |
- | // определить min_year, max_year для конкретной рубрики | + | |
- | // | + | |
- | + | ||
- | // Заполнить таблицу ссылок (all_volumes) для рубрики | + | |
- | FillChar(all_volumes, | + | |
- | for x := rubriks[i].index to rubriks[i].index+rubriks[i].count-1 do begin // прочесать все статьи для рубрики x | + | |
- | | + | |
- | | + | |
- | if (user_year >= min_year) and (user_year <= max_year) and | + | |
- | | + | |
- | then begin | + | |
- | if all_volumes[user_year, | + | |
- | | + | |
- | inc(all_volumes[user_year, | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | // Создать заголовок таблицы ссылок для рубрики | + | |
- | // | + | |
- | Rubriks_Articles.Add('< | + | |
- | Rubriks_Articles.Add('< | + | |
- | for y := min_vol to max_vol do begin | + | |
- | if y<10 | + | |
- | then Rubriks_Articles.Add(format('< | + | |
- | else Rubriks_Articles.Add(format('< | + | |
- | end; | + | |
- | Rubriks_Articles.Add('</ | + | |
- | // просчитать пределы годов отображения | + | |
- | for x := max_year downto min_year do begin | + | |
- | | + | |
- | if (all_volumes[x, | + | |
- | end; | + | |
- | for x := min_year to max_year do begin | + | |
- | | + | |
- | if (all_volumes[x, | + | |
- | end; | + | |
- | // вывести основную часть таблицы | + | |
- | for x := user_max_year downto user_min_year do begin | + | |
- | if (x mod 2) = 0 then style := ' | + | |
- | | + | |
- | for y := min_vol to max_vol do begin | + | |
- | if y < 10 | + | |
- | then year_vol_str := format(' | + | |
- | else year_vol_str := format(' | + | |
- | if (year_vol_str = ' | + | |
- | | + | |
- | if (all_volumes[x, | + | |
- | then Rubriks_Articles.Add(format('< | + | |
- | else Rubriks_Articles.Add('< | + | |
- | | + | |
- | end; | + | |
- | if (x = 1992) and (y = 6) then continue; // пропустить номер 1992 6 | + | |
- | if (all_volumes[x, | + | |
- | then Rubriks_Articles.Add(format('< | + | |
- | else Rubriks_Articles.Add('< | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | Rubriks_Articles.Add('</ | + | |
- | + | ||
- | end; | + | |
- | begin // собственно начало процедуры per_rubriks | + | |
- | if Assigned(IWorkbook) then | + | |
- | try | + | |
- | ISheet := IWorkbook.Worksheets.Item[' | + | |
- | ISheet_Rubr_index := IWorkbook.Worksheets.Item[' | + | |
- | ISheet_Rubriks := IWorkbook.Worksheets.Item[' | + | |
- | + | ||
- | Rubriks_TOC := TStringList.Create; | + | |
- | Rubriks_Names := TStringList.Create; | + | |
- | Rubriks_Articles := TStringList.Create; | + | |
- | + | ||
- | file_All_Rubriks_Index: | + | |
- | try | + | |
- | // создать конечный перечень - имя автора (заголовок, | + | |
- | + | ||
- | // загрузить лист "Содержание" | + | |
- | IRange := ISheet.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | SetLength(Articles, | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with Articles[i] do begin | + | |
- | | + | |
- | | + | |
- | title := Values[i, 3]; | + | |
- | page := Values[i, 4]; | + | |
- | link := Values[i, 5]; | + | |
- | | + | |
- | year := Values[i, 7]; | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | // загрузить лист " | + | |
- | IRange := ISheet_Rubr_index.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | Setlength(Rubr_index, | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with Rubr_index[i] do begin | + | |
- | name := Values[i, 1]; | + | |
- | index := Values[i, 2]; | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | // загрузить лист " | + | |
- | IRange := ISheet_Rubriks.UsedRange[0]; | + | |
- | Values := IRange.Value; | + | |
- | Setlength(Rubriks, | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | for i := 1 to IRange.Rows.Count do begin | + | |
- | local_progress.stepit; | + | |
- | with Rubriks[i] do begin | + | |
- | name := Values[i, 1]; | + | |
- | index := Values[i, 2]; | + | |
- | count := Values[i, 3]; | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | end; | + | |
- | + | ||
- | // создать список рубрик, | + | |
- | Sorted_rubriks := TStringList.Create; | + | |
- | for i := 1 to length(rubriks)-1 do begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | sorted_rubriks.Sort; | + | |
- | + | ||
- | // построить первую страницу (перечень групп рубрик и ссылка на алфавитный список рубрик) | + | |
- | + | ||
- | Rubriks_TOC.add('< | + | |
- | + | ||
- | Rubriks_TOC.add('< | + | |
- | odd_even := true; | + | |
- | // | + | |
- | Rubriks_TOC.add('< | + | |
- | Rubriks_TOC.add('< | + | |
- | x := 1; | + | |
- | repeat | + | |
- | | + | |
- | for i:=0 to 2 do begin | + | |
- | if (x+i > length(Rubriks_Groups)-1) then continue; | + | |
- | Rubriks_TOC.add(format('< | + | |
- | | + | |
- | | + | |
- | for i:=0 to 2 do begin | + | |
- | if (x+i > length(Rubriks_Groups)-1) then continue; | + | |
- | Rubriks_TOC.add(format('< | + | |
- | | + | |
- | | + | |
- | | + | |
- | until (x > length(Rubriks_Groups)-1); | + | |
- | Rubriks_TOC.add('</ | + | |
- | Rubriks_TOC.add('< | + | |
- | Rubriks_TOC.add('< | + | |
- | Rubriks_TOC.add('< | + | |
- | + | ||
- | // построить список всех рубрик (группированный по темам) | + | |
- | Rubriks_Names.add('< | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step := 1; | + | |
- | statusbar1.simpletext := ' | + | |
- | z := 0; | + | |
- | page_counter := 0; | + | |
- | odd_even := false; | + | |
- | (*// на странице уже есть | + | |
- | inc(page_counter, | + | |
- | inc(page_counter, | + | |
- | *) | + | |
- | prev_group: | + | |
- | + | ||
- | Rubriks_Names.Add('< | + | |
- | for i:= 1 to length(rubriks)-1 do begin | + | |
- | if (Rubriks[i].group_number<> | + | |
- | if (rows_counter> | + | |
- | for x:=z to 2 do begin // закончить последнюю строку в таблице | + | |
- | Rubriks_Names.Add('< | + | |
- | | + | |
- | Rubriks_Names.Add('</ | + | |
- | z := 0; // снова инициализировать счётчик столбцов | + | |
- | rows_counter := 0; | + | |
- | // | + | |
- | odd_even := false; // снова инициализировать полосатость | + | |
- | prev_group := Rubriks[i].group_number; | + | |
- | Rubriks_Names.add(format('< | + | |
- | // | + | |
- | page_counter := 27; | + | |
- | Rubriks_Names.Add('< | + | |
- | | + | |
- | + | ||
- | if z = 3 then begin // запустить новую строку | + | |
- | inc(page_counter, | + | |
- | inc(rows_counter); | + | |
- | z := 0; | + | |
- | if odd_even | + | |
- | then Rubriks_Names.Add('</ | + | |
- | else Rubriks_Names.Add('</ | + | |
- | odd_even: | + | |
- | | + | |
- | if (page_counter> | + | |
- | Rubriks_Names.Add('</ | + | |
- | z := 0; | + | |
- | rows_counter := 0; | + | |
- | page_counter := 0; | + | |
- | odd_even: | + | |
- | Rubriks_Names.add(format('< | + | |
- | inc(page_counter, | + | |
- | Rubriks_Names.Add('< | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | for x:=z to 2 do begin // закончить последнюю строку в таблице | + | |
- | | + | |
- | end; | + | |
- | Rubriks_Names.Add('</ | + | |
- | + | ||
- | // построить список всех рубрик, | + | |
- | + | ||
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step := 1; | + | |
- | statusbar1.simpletext := ' | + | |
- | z := 0; | + | |
- | page_counter := 0; | + | |
- | odd_even := false; | + | |
- | prev_group : | + | |
- | Rubriks_Names.add('< | + | |
- | inc(page_counter, | + | |
- | Rubriks_Names.add(format('< | + | |
- | inc(page_counter, | + | |
- | Rubriks_TOC.add(format(' | + | |
- | Rubriks_Names.Add('< | + | |
- | for i:= 0 to sorted_rubriks.Count-1 do begin | + | |
- | if (ord(upcase(sorted_rubriks.Strings[i][1]))<> | + | |
- | Rubriks_TOC.add(format(', | + | |
- | for x:=z to 2 do begin // закончить последнюю строку в таблице | + | |
- | | + | |
- | end; | + | |
- | Rubriks_Names.Add('</ | + | |
- | // | + | |
- | z := 0; // снова инициализировать счётчик столбцов | + | |
- | rows_counter := 0; | + | |
- | odd_even := false; // снова инициализировать | + | |
- | prev_group := ord(upcase(sorted_rubriks.Strings[i][1])); | + | |
- | if (page_counter> | + | |
- | | + | |
- | | + | |
- | end else Rubriks_Names.add(format('< | + | |
- | inc(page_counter, | + | |
- | Rubriks_Names.Add('< | + | |
- | | + | |
- | + | ||
- | if z = 3 then begin // запустить новую строку | + | |
- | inc(page_counter, | + | |
- | inc(rows_counter); | + | |
- | z := 0; | + | |
- | if odd_even | + | |
- | then Rubriks_Names.Add('</ | + | |
- | else Rubriks_Names.Add('</ | + | |
- | odd_even: | + | |
- | | + | |
- | if (page_counter> | + | |
- | Rubriks_Names.Add('</ | + | |
- | z := 0; | + | |
- | rows_counter := 0; | + | |
- | page_counter := 0; | + | |
- | odd_even: | + | |
- | // | + | |
- | Rubriks_Names.add(format('< | + | |
- | Rubriks_Names.Add('< | + | |
- | inc(page_counter, | + | |
- | | + | |
- | | + | |
- | + | ||
- | | + | |
- | | + | |
- | end; | + | |
- | for x:=z to 2 do begin // закончить последнюю строку в таблице | + | |
- | | + | |
- | end; | + | |
- | Rubriks_Names.Add('</ | + | |
- | Rubriks_TOC.add('</ | + | |
- | + | ||
- | // построить список нижнего уровня | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | Rubriks_Articles.add('< | + | |
- | prev_group := 0; | + | |
- | for i := 1 to length(Rubriks)-1 do begin | + | |
- | | + | |
- | if (Rubriks[i].group_number<> | + | |
- | prev_group := Rubriks[i].group_number; | + | |
- | Rubriks_Articles.add(format('< | + | |
- | | + | |
- | if rubriks[i].common=1 then begin // регулярная рубрика | + | |
- | // style=" | + | |
- | stroka := format('< | + | |
- | Rubriks_Articles.add(stroka); | + | |
- | show_table_rubrik(i); | + | |
- | end else begin // обычная рубрика | + | |
- | stroka := format('< | + | |
- | Rubriks_Articles.add(stroka); | + | |
- | Rubriks_Articles.add('< | + | |
- | for x: | + | |
- | with articles[Rubr_index[x].index] do begin | + | |
- | + | ||
- | if (year = ' | + | |
- | | + | |
- | | + | |
- | end else begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | stroka: | + | |
- | if (rubrika <> '' | + | |
- | if (author <> '' | + | |
- | if (title <> '' | + | |
- | stroka := stroka + '</ | + | |
- | Rubriks_Articles.Add(stroka); | + | |
- | | + | |
- | end; | + | |
- | Rubriks_Articles.add('</ | + | |
- | | + | |
- | end; | + | |
- | Rubriks_Articles.add('</ | + | |
- | statusbar1.simpletext: | + | |
- | + | ||
- | Rubriks_TOC.SaveToStream(file_All_Rubriks_Index); | + | |
- | Rubriks_Names.SaveToStream(file_All_Rubriks_Index); | + | |
- | Rubriks_Articles.SaveToStream(file_All_Rubriks_Index); | + | |
- | finally | + | |
- | IRange := nil; | + | |
- | ISheet := nil; | + | |
- | ISheet_Rubr_index := nil; | + | |
- | ISheet_Rubriks := nil; | + | |
- | setlength(articles, | + | |
- | setlength(Rubr_index, | + | |
- | setlength(Rubriks, | + | |
- | file_All_Rubriks_Index.Free; | + | |
- | Rubriks_TOC.Free; | + | |
- | Rubriks_Names.Free; | + | |
- | Rubriks_Articles.Free; | + | |
- | { | + | |
- | // открыть созданный Html во встроенном редакторе | + | |
- | Flags := 0; | + | |
- | html_preview.Navigate(WideString(prog_path+' | + | |
- | } | + | |
- | end; | + | |
- | except | + | |
- | raise Exception.Create(' | + | |
- | end; | + | |
- | end; | + | |
- | procedure make_bookmarks; | + | |
- | var Bookmarks_Content: | + | |
- | x, y: integer; | + | |
- | year_vol_str, | + | |
- | Const min_vol = 1; | + | |
- | max_vol = 12; | + | |
- | begin | + | |
- | Bookmarks_Content := TStringList.Create; | + | |
- | Bookmarks_Content.Add('< | + | |
- | Bookmarks_Content.Add('< | + | |
- | Bookmarks_Content.Add('< | + | |
- | Bookmarks_Content.Add('< | + | |
- | Bookmarks_Content.Add('< | + | |
- | Bookmarks_Content.Add('< | + | |
- | for x := max_year downto min_year do begin | + | |
- | | + | |
- | | + | |
- | for y := min_vol to max_vol do begin | + | |
- | if y<10 | + | |
- | then begin | + | |
- | year_vol_str := format(' | + | |
- | str_vol := format(' | + | |
- | end else begin | + | |
- | year_vol_str := format(' | + | |
- | str_vol := format(' | + | |
- | | + | |
- | if (year_vol_str = ' | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | if (x = 1992) and (y = 6) then continue; // пропустить номер 1992 6 | + | |
- | Bookmarks_Content.Add(format('< | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | Bookmarks_Content.Add('</ | + | |
- | Bookmarks_Content.Add('< | + | |
- | Bookmarks_Content.Add('</ | + | |
- | Bookmarks_Content.SaveToFile(' | + | |
- | end; | + | |
- | begin | + | |
- | global_progress.Min: | + | |
- | global_progress.max: | + | |
- | global_progress.Position: | + | |
- | global_progress.Step: | + | |
- | statusbar1.simpletext: | + | |
- | CreateBatches; | + | |
- | Load_complex_rubriks; | + | |
- | Load_rubriks_groups; | + | |
- | global_progress.StepIt; | + | |
- | + | ||
- | if chk_make_bookmarks.Checked then begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | global_progress.StepIt; | + | |
- | + | ||
- | if chk_make_content.Checked then begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | global_progress.StepIt; | + | |
- | + | ||
- | if chk_make_authors.Checked then begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | global_progress.StepIt; | + | |
- | + | ||
- | if chk_make_rubriks.Checked then begin | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | global_progress.StepIt; | + | |
- | + | ||
- | statusbar1.simpletext: | + | |
- | make_bookmarks; | + | |
- | global_progress.StepIt; | + | |
- | statusbar1.simpletext: | + | |
- | local_progress.Position := local_progress.Max; | + | |
- | global_progress.Position := global_progress.Max; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.btn_simple_volumeClick(Sender: | + | |
- | begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.btn_Collect_DataClick(Sender: | + | |
- | type temp_content_element = record | + | |
- | rubrika : string; | + | |
- | author : string; | + | |
- | title : string; | + | |
- | page : string; | + | |
- | link : string; | + | |
- | volume : string; | + | |
- | year : string; | + | |
- | responsible : string; | + | |
- | | + | |
- | var FullFileName: | + | |
- | x, n, position: | + | |
- | Values: OLEVariant; | + | |
- | IRange: Excel8TLB.Range; | + | |
- | ISheet: Excel8TLB._Worksheet; | + | |
- | Content: array of temp_content_element; | + | |
- | x_volume : string; | + | |
- | x_year : string; | + | |
- | x_responsible : string; | + | |
- | use_interpolation: | + | |
- | procedure check_content(FullFileName: | + | |
- | var test: | + | |
- | | + | |
- | if use_interpolation then begin | + | |
- | if trim(rubrika+author+title+page+link)='' | + | |
- | end else begin | + | |
- | if trim(rubrika+author+title+page+link+volume+year+responsible)='' | + | |
- | end; | + | |
- | if (trim(page)='' | + | |
- | then ShowMessageInLog(year, | + | |
- | if (trim(rubrika + author + title) = '' | + | |
- | then ShowMessageInLog(year, | + | |
- | try | + | |
- | | + | |
- | except | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | if (test> | + | |
- | then ShowMessageInLog(year, | + | |
- | try | + | |
- | | + | |
- | except | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | if (test> | + | |
- | then ShowMessageInLog(year, | + | |
- | try | + | |
- | | + | |
- | except | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | if (test<1) or (test> | + | |
- | then ShowMessageInLog(year, | + | |
- | if rubrika = ' | + | |
- | then rubrika := ' | + | |
- | if rubrika = ' | + | |
- | then rubrika := ' | + | |
- | if rubrika = ' | + | |
- | then rubrika := ' | + | |
- | if rubrika = ' | + | |
- | then rubrika := ' | + | |
- | if title = ' | + | |
- | title := ''; | + | |
- | if rubrika = '' | + | |
- | then rubrika := ' | + | |
- | else rubrika := rubrika + ' | Маленькие хитрости'; | + | |
- | | + | |
- | | + | |
- | function cure_volume(stroka: | + | |
- | | + | |
- | if length(stroka)=1 | + | |
- | then result := ' | + | |
- | else result := stroka; | + | |
- | | + | |
- | function cure_page(stroka: | + | |
- | | + | |
- | try | + | |
- | | + | |
- | except | + | |
- | end; | + | |
- | result: | + | |
- | | + | |
- | function cure(stroka: | + | |
- | var temp: string; | + | |
- | | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | temp: | + | |
- | result: | + | |
- | | + | |
- | begin | + | |
- | OpenDialog1.InitialDir: | + | |
- | OpenDialog1.Options: | + | |
- | if not OpenDialog1.Execute then exit; // свалить, | + | |
- | + | ||
- | if Application.MessageBox( | + | |
- | ' | + | |
- | ' | + | |
- | MB_YESNO) = IDYES then use_interpolation: | + | |
- | statusbar1.simpletext: | + | |
- | local_progress.Min: | + | |
- | local_progress.max: | + | |
- | local_progress.Position: | + | |
- | local_progress.Step: | + | |
- | global_progress.Min: | + | |
- | global_progress.max: | + | |
- | global_progress.Position: | + | |
- | global_progress.Step: | + | |
- | for n:=0 to OpenDialog1.Files.Count-1 do begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | if Assigned(IXLSApp) and (not Assigned(IWorkbook2))then | + | |
- | try | + | |
- | try | + | |
- | | + | |
- | EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, | + | |
- | EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, false, 0); | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | + | ||
- | // взять значение номера, | + | |
- | if use_interpolation then begin | + | |
- | x_volume := Values[2, | + | |
- | x_volume := cure(x_volume); | + | |
- | x_volume := cure_volume(x_volume); | + | |
- | x_year := Values[2, | + | |
- | x_year := cure(x_year); | + | |
- | x_responsible := Values[2, | + | |
- | x_responsible := cure(x_responsible); | + | |
- | | + | |
- | for x:=2 to IRange.Rows.Count do begin | + | |
- | with Content[position + x - 2] do begin | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | title := Values[x, | + | |
- | title := cure(title); | + | |
- | page := Values[x, | + | |
- | page := cure(page); | + | |
- | page := cure_page(page); | + | |
- | link := Values[x, | + | |
- | link := cure(link); | + | |
- | if use_interpolation then begin | + | |
- | volume := x_volume; | + | |
- | year := x_year; | + | |
- | responsible := x_responsible; | + | |
- | end else begin | + | |
- | volume := Values[x, | + | |
- | volume := cure(volume); | + | |
- | volume := cure_volume(volume); | + | |
- | year := Values[x, | + | |
- | year := cure(year); | + | |
- | responsible := Values[x, | + | |
- | responsible := cure(responsible); | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | raise Exception.Create(' | + | |
- | | + | |
- | | + | |
- | try | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | // | + | |
- | // | + | |
- | + | ||
- | // выгрузить инфу на лист ISheet_auth_index | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | for x:=0 to length(Content)-1 do begin | + | |
- | local_progress.StepIt; | + | |
- | with Content[x] do begin | + | |
- | if page = '' | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | finally | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | global_progress.stepit; | + | |
- | statusbar1.simpletext: | + | |
- | IWorkbook.Save(0); | + | |
- | + | ||
- | local_progress.Position := local_progress.Max; | + | |
- | global_progress.Position := global_progress.Max; | + | |
- | statusbar1.simpletext: | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.Button1Click(Sender: | + | |
- | begin | + | |
- | errorlog.Items.Clear; | + | |
- | end; | + | |
- | + | ||
- | procedure TForm1.Button2Click(Sender: | + | |
- | var otchet : TStringList; | + | |
- | x: integer; | + | |
- | begin | + | |
- | | + | |
- | | + | |
- | if SaveDialog1.Execute then begin | + | |
- | for x:=0 to ErrorLog.Items.Count-1 do begin | + | |
- | with ErrorLog.Items.Item[x] do | + | |
- | otchet.Add(format(' | + | |
- | end; | + | |
- | otchet.SaveToFile(SaveDialog1.FileName); | + | |
- | | + | |
- | | + | |
- | end; | + | |
- | + | ||
- | end. | + | |
- | + | ||
- | // Особая позиция! Только для служебного " | + | |
- | // | + | |
- | // Я люблю Microsoft. Всей своей мелкой душонкой, | + | |
- | // Я люблю эту фирму за то, что периодически веселит меня изменениями в логике методов интерфейсов | + | |
- | // ее приложений. За то, что мне не скучно жить от все увеличивающихся сервис-паков и сервис-релизов. | + | |
- | // За редактор VBA я тоже ее люблю, а особенно за ToolTips в нем и F5/F8/F9 в отладчике. И за язык | + | |
- | // этот самый я ее люблю. И за " | + | |
- | // И за обработку исключений, | + | |
- | // же код может работать, | + | |
- | // давления, | + | |
- | // парами десятков потоков. Он, ведь, практически не использует ресурсов? | + | |
- | // Word, забыв сохранить последний мой файл. А Excel от этого только устойчивей. Он под натиском | + | |
- | // обработчиков событий просто вешает своих клиентов, | + | |
- | // закрывать, | + | |
- | // Так я люблю Microsoft, такой сильною любовью, | + | |
- | // Но видно не выжила б эта женщина в наших широтах с нашим климатом и под НАШИМИ звездами. | + | |
- | // | + | |
- | // А еще мне нравится справка по VBA. Особенно, | + | |
- | // Или они думали, | + | |
- | // свойство SubTotals у объекта PivotField?" | + | |
- | // | + | |
- | // Злой. | + | |
- | + | ||
- | + | ||
- | </ | + | |
- | + | ||
- | + |
science_and_life/isxodniki.txt · Last modified: 2017/03/13 18:20 by kibi