Компьютерный зал, Больница традиционной китайской медицины Уси, провинция Цзянсу
Юань Бо
----Система управления информацией нашей больницы использует программирование Delphi. Поскольку требования каждого предмета разные, а формы отчетов также разнообразны, писать - головная боль. Delphi работает на платформе WINDOWS, и печать полностью отличается от печати под DOS. Quick Report сложно контролировать и требует ресурсов. Для немного сложного отчета с особыми требованиями реализовать Quick Report невозможно. Вот некоторые методы реализации типичных отчетов, встречающихся в программировании.
---- 1. Финансовый отдел любого подразделения имеет несколько толстых бухгалтерских книг. Финансовый отдел нашей больницы предложил распечатать бухгалтерскую книгу склада лекарств, чтобы избавиться от ручного бухгалтерского учета. Это можно рассматривать как модернизацию. Просьба разумная, декан. Еще сказано, что так и должно быть. Глядя на маленькие красные и зеленые карточки, предоставленные Министерством финансов, напечатанные одинаково и с межстрочным интервалом 3 мм, я не мог не подумать о добродетели бережливости китайского народа. Учитывая, что каждый препарат должен быть распечатан хотя бы один раз, и ни одна строка таблицы не пропущена. Кроме того, в больнице традиционной китайской медицины имеется более 2000 видов лекарств, поэтому этот отчет необходимо распечатать на лазерном принтере (т.к.). а как уговорить декана на покупку лазерного принтера, то Другое дело, как автоматизация делопроизводства может быть без затрат?) Идея реализации программы заключается в том, чтобы использовать бумагу для печати в качестве холста для рисования на ней небольших прямоугольников, что конкретно реализуется с помощью следующих процессов: (Пусть форма будет называться Ttzview).
Сначала определите в программе два класса:
titlerecord=запись
Текущее:Трект;
Название:строка;
конец;
Detailrecord=запись
Арект:Трект;
выравнивание:Слово;
конец;
---- Установите следующие четыре процесса;
---- RectDraw(Acanvas:Tcanvas;s:string;R:Trect;frame:boolean;position:word);
---- Этот процесс используется для рисования прямоугольника, а рамка определяет, следует ли рисовать линию (конечно, здесь она должна быть нарисована!);
----PRintinitit(firsttop,firstleft:integer);
---- Этот процесс используется для инициализации, которая заключается в определении положения каждого маленького прямоугольника на бумаге;
---- printtitle(acanvas:Tcanvas);
----Этот процесс предназначен для печати заголовка, поскольку символы в заголовке всегда больше;
---- printdetail(acanvas:Tcanvas;Qtz:Tdataset;acount:integer;firstpage:integer);
----Этот процесс заключается в печати конкретного содержимого. На одной странице печатается 40 строк. Если этого недостаточно, измените страницу. Короче говоря, на одной странице может быть только одно лекарство;
---- printhj(acanvas:Tcanvas);
---- С первого взгляда можно сказать, что этот процесс заключается в выводе итоговой суммы!
---- Просто создайте Botton и последовательно вызовите четыре процесса printinitit, printtitle, printdetail и printhj.
---- (Формат вызова: printtitle(printer.canvas);)
---- Кстати, Qtz - это запрашиваемые данные реестра, как их генерировать, здесь обсуждаться не будет.
----Конкретные процедуры заключаются в следующем:
---- Эта программа работает на платформах delphi1, delphi3 WIN3.2, WIN95, WIN97 и WIN98. Кстати, она обеспечивает библиотечную структуру базы данных реестра.
---- 2. Очень сложные и непонятные отчеты
---- Отделению онкологии нашей больницы необходимо распечатать медицинские карты пациентов. Это часть модернизации специальностей. Бюро здравоохранения приедет для проверки, поэтому задание необходимо выполнить. Каждая медицинская карта содержит более 100 элементов. Если вы используете Qreport, если вам нужно добавить или вычесть элемент посередине (это случается часто), корректировка и расположение десятков элементов заставят людей потерять сознание. Я создал более 100 временных переменных одновременно и рисовал на виртуальном холсте. На моей машине PII233 с памятью 64 МБ все работало гладко, но когда я переключился на машину онкологического отделения с памятью 486,8 МБ (все, не смейтесь), системный стек немедленно переполнится, поэтому мне придется прибегнуть к методу указателя (кажется, мой уровень программирования снова улучшился, втайне рад), метод следующий:
Сначала создайте класс titleprint:
titleprint=^Titlerecord;
titlerecord=запись
Текущее:Трект;
Название:строка[50];
конец;
Затем создайте процесс printnow (имя формы
zlk, printdot — количество точек принтера, обычно 180);
процедура Tzlk.printnow(acanvas:Tcanvas);
вар я, х, у, pc_count: целое число;
myprint:array[0..200] titleprint;
начинать
firsttop:=round(int(0,5/2,54*printdot));
firstleft:=round(int(0,1/2,54*printdot));
rowheight:=round(int(0,7/2,54*printdot));
x:=0+firstleft;y:=round(int
(1,3/2,54*printdot))+первыйверх;
ПК_count: = 0;
вкл (pc_count); новый (myprint [pc_count]);
myprint[pc_count]^.currect:=rect
(x+round(int(0,1/2,54*printdot))+firstleft,y,
x+round(int(3.0/2.54*printdot))+firstleft,
y+firsttop+round(int(0.5/2.54*printdot)));
myprint[pc_count]^.atitle:=Lname.
заголовок+имяБД.текст;
ACanvas.MoveTo(myprint[pc_count]^.
текущий.левый,
myprint[pc_count]^.currect.top-round
(высота строки/5));
{Следующие четыре строки будут повторяться более 100 раз, что по сути одно и то же.
Я пишу их все не для того, чтобы заработать гонорары}
вкл (pc_count); новый (myprint [pc_count]);
myprint[pc_count]^.currect:=scalerect(
myprint[pc_count-1]^.currect,round(int
(2,5/2,54*печатная точка)),0);
myprint[pc_count]^.atitle:=Lxb.caption+Cxb.text;
ACanvas.LineTo(myprint[i]^.currect.right,
myprint[i]^.currect.top-round(rowheight/5));
.......
{Печать}
printtitle (холст);
{Эта функция не будет предоставлена, не имеет значения, если вам не нужен заголовок}
для i:=1 до pc_count сделать
начинать
RectDraw(Acanvas,myprint[i]^.atitle,
myprint[i]^.currect,false,
dt_left или dt_singleline или dt_vcenter);
конец;
располагать (myprint [pc_count]);
{Не забудьте освободить память, занятую указателем}
конец;
---- Наконец, создайте Botton, добавьте оценку, действительно ли он напечатан, а затем вызовите эти функции.
---- (Формат вызова: printtitle(printer.canvas);)
---- Прочитав два приведенных выше примера, считаете ли вы, что печать в WINDOWS на самом деле очень проста, как рисование таблицы вручную, и расположение содержимого таблицы по центру, слева или справа полностью зависит от Выравнивание печатного контента. Формат печати определяется Форматом отображения контента. Вам не придется рассчитывать его самостоятельно, что очень удобно.