Автор Гілка: Системний програміст...  (Прочитано 11988 раз)

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Системний програміст...
« Відповідей #15 : 2006-12-11 19:45:14 »
А напишіть но автоматизовану систему повідомлень, щось типу email, котра має інтерфейс в якому може розібратися будь-який прапорщик, повністю контролює всі дії користувача та формує купу звітів на С++ без RAD. А на Delphi це хоч так уж достатньо просто, але можливо - розробка для одного програміста.

Ну скажем повністю контролювати всі дії користувача можна з допомогою робота з монтованою камерою, який бігатиме за користувчем.  ;)
Але "купу звітів на Сі++ в яких може розібратися будь-який прапощик" - це не реально навіть на Дельфі.  [smiley=am.gif]
[Fedora Linux]

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Системний програміст...
« Відповідей #16 : 2006-12-12 17:13:19 »
Хоча, якщо чесно, там немає чогось вартісного - банальна реалізація оберненої польської нотації.
Щось типу цього?
fun_fs.c
/*Training program for cfkculatin functions*/

#include <ctype.h>

#include <stdlib.h>

void charadd(char *ch,char c)

{

 int i;

 for(i=0;ch[i];i++);ch[i]=c;ch[i+1]=0;

}



int analisis(double *consts,int *ops,int nc,int no, char *form)

{

 int i; char digstr[10]; int isdig, iconsts,iops,ispoint,isexp;

 isdig=0; iconsts=0; iops=0;

 *digstr=0;ispoint=0;isexp=0;

 for(i=0;form[i];i++)/* by characters */

 {

  if(isdigit(form[i])){isdig=1;charadd(digstr,form[i]);}

  else

  if(form[i]=='.'||form[i]==',')

  {

   if(ispoint||isexp)return 5;

   ispoint=1;

   charadd(digstr,'.');

  }/*if*/

  else

  if(form[i]=='e'||form[i]=='E')

  {

   if(isexp)return 6;

   isexp=1;

   if(!isdig)

    {charadd(digstr,'1');isdig=1;}

   charadd(digstr,'e');if(form[++i]=='-')charadd(digstr,'-');else i--;

   if(!isdigit(form[i+1])) return 1;

  }/*if*/

  else

  {

   if(isdig)

   {

    consts[iconsts]=strtod(digstr,(char**)NULL);*digstr=0;isdig=0;isexp=0;ispoint=0;

    ops[iops]=iconsts;

    iops++;

    if(iops>=no)return 2;

    iconsts++;

    if(iconsts>=nc)return 3;

   }/*if*/

   switch(form[i])

   {

    case '+':ops[iops]=-1;break;

    case '-':ops[iops]=-2;break;

    case '*':ops[iops]=-3;break;

    case '/':ops[iops]=-4;break;

    case '(':ops[iops]=-5;break;

    case ')':ops[iops]=-6;break;

    default : return 4;

   }/*switch*/

   iops++;

   if(iops>=no)return 2;

  }/*else*/

 }/*for by characters*/

   if(isdig)

  {

   consts[iconsts]=atof(digstr);

   ops[iops]=iconsts;

   iops++;

   if(iops>=no)return 2;

  }/*if*/

 ops[iops]=-7;

 return 0;

}



/*switch for + / - */

#define __switch_p_m  switch(stek_op[cst_op-1]) {  \

case -1: stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break;\

case -2: stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break;\

case -3: stek[cstek-1]*=stek[cstek];cstek--;cst_op--;\

if(cst_op>0) switch(stek_op[cst_op-1]) {           \

case -1: stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break;\

case -2: stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break;\

  } break;\

case -4: stek[cstek-1]/=stek[cstek];cstek--;cst_op--;\

if(cst_op>0) switch(stek_op[cst_op-1]) {           \

case -1: stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break;\

case -2: stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break;\

  } break;\

}          \

/*end of definning*/

double interpret(double *consts,int *ops)

{

 double stek[10]; int stek_op[10];

 int cstek=0,cst_op=0,uniq=0,i;char isfirstload=1;

 for(i=0;ops[i]!=-7;i++)

 {

  if(ops[i]>=0)

  {

   if(isfirstload)isfirstload=0;else cstek++;

   stek[cstek]=consts[ops[i]];

   if(uniq){stek[cstek]*=-1.;uniq=0;}

  }

  else

  {

   if(ops[i]==-2)if(i==0)uniq=1;else if(ops[i-1]==-5) uniq=1;

   else

   {

   if(cst_op>0)

    __switch_p_m

    stek_op[cst_op]=-2;cst_op++;

   }

   if(ops[i]==-1)

   {

    if(cst_op>0)

    __switch_p_m

    stek_op[cst_op]=-1;cst_op++;

   }

   if(ops[i]==-3)

   {

    if(cst_op>0)

    switch(stek_op[cst_op-1])

    {

     case -3:stek[cstek-1]*=stek[cstek];cstek--;cst_op--;break;

     case -4:stek[cstek-1]/=stek[cstek];cstek--;cst_op--;break;

    }

    stek_op[cst_op]=-3;cst_op++;

   }

   if(ops[i]==-4)

   {

    if(cst_op>0)

    switch(stek_op[cst_op-1])

    {

     case -3:stek[cstek-1]*=stek[cstek];cstek--;cst_op--;break;

     case -4:stek[cstek-1]/=stek[cstek];cstek--;cst_op--;break;

    }

    stek_op[cst_op]=-4;cst_op++;

   }

   if(ops[i]==-5){if(uniq){stek_op[cst_op]=-7;uniq=0;}

    else stek_op[cst_op]=-5;cst_op++;}

   if(ops[i]==-6)

   {

    /*if(stek_op[cst_op-1]==-5)cst_op--;

    else                                */

    {

     switch(stek_op[cst_op-1])

     {

      case -1:stek[cstek-1]+=stek[cstek];cstek--;cst_op--;

       switch(stek_op[cst_op-1])

       {

        case -5:cst_op--;break;

        case -7:cst_op--;stek[cstek]*=-1.;break;

       }break;

      case -2:stek[cstek-1]-=stek[cstek];cstek--;cst_op--;

       switch(stek_op[cst_op-1])

       {

        case -5:cst_op--;break;

        case -7:cst_op--;stek[cstek]*=-1.;break;

       }break;

      case -3:stek[cstek-1]*=stek[cstek];cstek--;cst_op--;

       switch(stek_op[cst_op-1])

       {

        case -1:stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break;

        case -2:stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break;

        case -5:cst_op--;break;

        case -7:cst_op--;stek[cstek]*=-1.;break;

       }break;

       case -4:stek[cstek-1]/=stek[cstek];cstek--;cst_op--;

       switch(stek_op[cst_op-1])

       {

        case -1:stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break;

        case -2:stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break;

        case -5:cst_op--;break;

        case -7:cst_op--;stek[cstek]*=-1.;break;

       }break;

      case -5:cst_op--;break;

      case -7:cst_op--;stek[cstek]*=-1.;break;

     }

    }

   }

  }

 }

 if(cst_op>0)

 __switch_p_m

 return *stek;

}/*interpret*/



int varify(int* ops)

{

 int i,br;

 for(i=0,br=0;ops[i]!=-7;i++)

 {

  if(ops[i]==-5)br++;

  if(ops[i]==-6){br--;if(br<0)return 1;}

 }

 if(br>0)return 2;



 if(ops[0]<0&&ops[0]!=-2&&ops[0]!=-5)return 3;

 for(i=1;ops[i]!=-7;i++)

 if(ops[i]<0)

 {

  if(ops[i]==-5)

  {

   if(ops[i-1]>=0) return 4;

   if(ops[i-1]==-6)return 5;

  }

  else if(ops[i-1]<0&&!(ops[i]==-2&&ops[i-1]==-5)&&ops[i-1]!=-6)return 6;

 }

 if(ops[i-1]!=-6&&ops[i-1]<0) return 7;

 return 0;

}

fun_fs.h
int anlisis(double *,int *,int,int,char*);

double interpret(double*,int*);

int varify(int*);

interf.c
#include <stdio.h>

#include "fun_fs.h"

main()

{

char str[40];

int oprs[20],i;

double cnsts[10];

do

{

printf("enter a formula correctly:");

scanf("%s",str);

printf("error in numbers: %d\n",analisis(cnsts,oprs,10,20,str));

printf("error in operators: %d\n",varify(oprs));

for(i=0;i<15;i++)printf("%g\t%d\n",cnsts[i],oprs[i]);

printf("result is %g\n",interpret(cnsts,oprs));

}while(*str!='^');

}



Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Приколи
« Відповідей #17 : 2006-12-13 13:12:55 »
Ось страждав фігнею: почитав документацію до  zip  формату  і вирішив перевірити деякі поля, зацікавили мене дата і час останньої модифікації  запакованого файлу і там описувалось , що перші 5 біт вдповідають за секунди, наступні 6 - за хвилини, 5 - за години і т.д. Написав одразу програмку на С, яка мала визначити ці данні (правильність роботи своєї навчальної програми перевіряв з допомогою pkunzip). Мучився, мучився - все запрацювало і аж потім зрозумів, що пойнтери вказують на молодші байти  ;D
А перед дельфістами така проблема позтає? Вони взагалі щось чули про адресну арифметику? (в Turbo Pascal спеціальні функції пойнтерами совають  :o)

В С дуже зручний цикл for: іноді в середині дужок такого понаписуєш, що й тіло циклу виявиться непотрібним.
інструкція с++; в паскалі реалізується :  с:=с+1; Навіщо так багато мучитись а про a=b=c=d=0; я взагалі мовчу  ;)
Пишучи програму на с іноді так починаєш любуватись вишуканістю собою ж написаних виразів, особливо, коли робиться перетворення типів.
« Змінено: 2006-12-13 13:13:22 від serg_ik »
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Soft

  • Кореспондент
  • ***
  • дописів: 100
  • Карма: +0/-0
  • Чому саме Лінукс?
Re: Приколи
« Відповідей #18 : 2006-12-13 14:22:45 »
Ось страждав фігнею: почитав документацію до  zip  формату  і вирішив перевірити деякі поля, зацікавили мене дата і час останньої модифікації  запакованого файлу і там описувалось , що перші 5 біт вдповідають за секунди, наступні 6 - за хвилини, 5 - за години і т.д. Написав одразу програмку на С, яка мала визначити ці данні (правильність роботи своєї навчальної програми перевіряв з допомогою pkunzip). Мучився, мучився - все запрацювало і аж потім зрозумів, що пойнтери вказують на молодші байти  ;D
А перед дельфістами така проблема позтає? Вони взагалі щось чули про адресну арифметику? (в Turbo Pascal спеціальні функції пойнтерами совають  :o)

В С дуже зручний цикл for: іноді в середині дужок такого понаписуєш, що й тіло циклу виявиться непотрібним.
інструкція с++; в паскалі реалізується :  с:=с+1; Навіщо так багато мучитись а про a=b=c=d=0; я взагалі мовчу  ;)
Пишучи програму на с іноді так починаєш любуватись вишуканістю собою ж написаних виразів, особливо, коли робиться перетворення типів.

1. PbyteArray, PwordArray, PDwordArray, @, Addr, Pointer...
2. с++ inc(c) c-- dec(c)
3. при неявному перетвореннi душе довго доводиться шукати баги.

Відсутній miwa

  • Літератор
  • ******
  • дописів: 1111
  • Карма: +0/-0
Re: Системний програміст...
« Відповідей #19 : 2006-12-13 19:02:43 »
Цитата
про a=b=c=d=0; я взагалі мовчу
Оце так, паскалю цього справді не вистачає  :(
Цитата
Пишучи програму на с іноді так починаєш любуватись вишуканістю собою ж написаних виразів, особливо, коли робиться перетворення типів.
Так-то воно так, але пік самозахоплення наступає тоді, коли ні з того ні з цього програма починає видавати незрозумілі глюки і після тижня нецензурних слів і впертого тараканолапання знаходиш поблему - відсутність, наприклад, "зірочки" у присвоєнні (р=0; замість *р=0;) посеред якогось такого вишуканого виразу ;о)

Це все я до того, що елегантність коду і свобода програмування мають і свій негативний бік.
Читайте документацію - вона кермує.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Системний програміст...
« Відповідей #20 : 2006-12-13 21:57:16 »
Так-то воно так, але пік самозахоплення наступає тоді, коли ні з того ні з цього програма починає видавати незрозумілі глюки і після тижня нецензурних слів і впертого тараканолапання знаходиш поблему - відсутність, наприклад, "зірочки" у присвоєнні (р=0; замість *р=0;) посеред якогось такого вишуканого виразу ;о)

Це все я до того, що елегантність коду і свобода програмування мають і свій негативний бік.

Я помітив таку річ, що незалежно від мови програмування програміст може як написати хорошу програму за стислий термін так і дуже криву програму за довгий термін. АЛЕ, особливо при колективній роботі, дуже важлива підтримка на рівні мови програмування засобів звуження контексту.

Напр. якщо у вас є програма яка розбита на чотири об'єкти(підсистеми) в кожному з яких є чотири місця де можна щось поламати, то при пошуку проблеми нам треба перебрати до 8-ми варіантів - до 4-ох щоб визначити в якому об'єкті помилка, до 4-ох щоб визначити місце в об'єкті де щось поламалося.

Якщо програма не розбита на об'єкти (підсистеми, контексти, і т.ін.) то скоріше за все нам доведеться перебирати до 20-ти варіантів, а може й більше.

Коротше кажучи, мова яка стимулює програміста весь час займатися декомпозицією програми (напр. Пітон) дає в результаті суттєвий виграш при інших рівних за рахунок зменшення кількості помилок і полегшення їх знаходження в складних проектах.

Якщо мова не стимулює до гарного коду, хоча й надає всі необхідні для цього засоби, то для досягнення такого самого результату необхідне якесь стимулювання ззовні або самодисципліна.

Якщо ж мова стимулює до написання поганого коду, то програма пишеться значно довше і містить значно більше помилок крім випадків коли програміст святий або геній.

Мова Сі (а особливо Сі++) відносяться до тих мов, які стимулюють до хаків. Напр. хак з символом \0 як індикатором кінця рядка створив стільки проблем що я підозрюю що час який був страчений на вирішення цих проблем з лихвою перекрив весь час зекономлений цим хаком. Також завдяки цьому хаку нам доводиться тепер миритися з UTF-8 і його глюками..

Але зворотна проблема в тому що при звужені контексту часто починається дублювання інформації, так що такі програми часто їдять пам'ять відрами. :-(
« Змінено: 2006-12-13 22:01:00 від lvm »
[Fedora Linux]

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Системний програміст...
« Відповідей #21 : 2006-12-14 13:12:51 »
Цитата
Мова Сі (а особливо Сі++) відносяться належать до тих мов, які стимулюють до хаків.
А що таке хак?
Скільки не викидав коників з завершуючим нулен - не помічав, що він створює проблеми (проблеми виникають, коли його нема  ;D)

А ще бувають проблеми, з типами
ось два однакові коди:
Глючний під досом (але не глючний під лінуксом)
#include <stdio.h>
char* ldec8(long int in)
{
static char out[9];
long int j, ou;
ou = in;
for(j=7;j>=0;j--,ou/=10)
 out[j]='0'+(ou%10);
 out[8]=0;
return out;
}


int Dshift(int Y,int M,int D)
{
int N,i,Sh;
int md[12]={31,28,31,30,31,30,31,31,30,31,30,31};
N=Y-1;
if((!(Y%4))&&(Y%100)||(!(Y%400)))md[1]=29;
Sh=365*N+N/4-N/100+N/400;
for(i=0;i<M-1;i++)Sh+=md[i];
Sh+=D;
return Sh;
}
struct datetime
{int dt_year,dt_month,dt_day,dt_hour,dt_min,dt_sec;};
struct datetime searchdate(unsigned long int seconds)
{
int nvp=1969/4-1969/100+1969/400;
long int days,years,nv,Y,diy,sum,i;
long int secrem;
int md[12]={31,28,31,30,31,30,31,31,30,31,30,31};
struct datetime dt;
days=seconds/(86400);
printf("days = %d\n",days);
years=days/365;
again:
Y=years+1969;
nv=(Y)/4-(Y)/100+(Y)/400-nvp;
diy=days-years*365-nv;
if(diy<0){years--;goto again;}
Y++;
if((!(Y%4))&&(Y%100)||(!(Y%400)))md[1]=29;
for(sum=0,i=-1;diy>sum;)sum+=md[++i];
if(i>=0)sum-=md[i];
dt.dt_year=1970+years;
dt.dt_month=i<0?1:i+1;
dt.dt_day=diy-sum+1;
secrem=seconds%(86400);
dt.dt_hour=secrem/3600;
secrem%=3600;
dt.dt_min=secrem/60;
secrem%=60;
dt.dt_sec=secrem;
return dt;
}
unsigned long int Secundo(int D,int M,int Y,int H,int m,int S)
{
long int days;
unsigned long int res;
days=Dshift(Y,M,D)-Dshift(1970,1,1);
res=days*86400;
res+=H*3600;
res+=m*60+S;
return res;
}

int main()
{
int d,m,y,h,mi,s;
unsigned long int seconds;
struct datetime dt;
printf("d m y h mi s   ");
scanf("%d%d%d %d%d%d",&d,&m,&y,&h,&mi,&s);
seconds=Secundo(d,m,y,h,mi,s);
dt=searchdate(seconds);
printf("%s\n%d-%d-%d\t%d:%d:%d\n",
ldec8(seconds),dt.dt_day,dt.dt_month,dt.dt_year,dt.dt_hour,dt.dt_min,dt.dt_sec);
return 0;
}

Не глючний взагалі:
char* ldec8(long int in)
{
static char out[9];
long int j, ou;
ou = in;
for(j=7;j>=0;j--,ou/=10)
 out[j]='0'+(ou%10);
 out[8]=0;
return out;
}


int Dshift(int Y,int M,int D)
{
int N,i,Sh;
int md[12]={31,28,31,30,31,30,31,31,30,31,30,31};
N=Y-1;
if((!(Y%4))&&(Y%100)||(!(Y%400)))md[1]=29;
Sh=365*N+N/4-N/100+N/400;
for(i=0;i<M-1;i++)Sh+=md[i];
Sh+=D;
return Sh;
}
struct datetime
{int dt_year,dt_month,dt_day,dt_hour,dt_min,dt_sec;};
struct datetime searchdate(unsigned long int seconds)
{
int nvp=477;
long int days,years,nv,Y,diy,sum,i;
long int secrem;
int md[12]={31,28,31,30,31,30,31,31,30,31,30,31};
struct datetime dt;
days=seconds/86400L;
years=days/365L;
again:
Y=years+1969L;
nv=(Y)/4-(Y)/100+(Y)/400-nvp;
diy=days-years*365L-nv;
if(diy<0){years--;goto again;}
Y++;
if((!(Y%4))&&(Y%100)||(!(Y%400)))md[1]=29;
for(sum=0,i=-1;diy>sum;)sum+=md[++i];
if(i>=0)sum-=md[i];
dt.dt_year=1970+years;
dt.dt_month=i<0?1:i+1;
dt.dt_day=diy-sum+1;
secrem=seconds%86400L;
dt.dt_hour=secrem/3600L;
secrem%=3600L;
dt.dt_min=secrem/60L;
secrem%=60L;
dt.dt_sec=secrem;
return dt;
}
unsigned long int Secundo(int D,int M,int Y,int H,int m,int S)
{
long int days;
unsigned long int res;
days=Dshift(Y,M,D)-Dshift(1970,1,1);
res=(long)days*86400;
res+=(long)H*3600;
res+=(long)m*60l+(long)S;
return res;
}

int main()
{
int d,m,y,h,mi,s;
unsigned long int seconds;
struct datetime dt;
printf("d m y h mi s   ");
scanf("%d%d%d %d%d%d",&d,&m,&y,&h,&mi,&s);
seconds=Secundo(d,m,y,h,mi,s);
dt=searchdate(seconds);
printf("%s\n%d-%d-%d\t%d:%d:%d\n",
ldec8(seconds),dt.dt_day,dt.dt_month,dt.dt_year,dt.dt_hour,dt.dt_min,dt.dt_sec);
return 0;
}

Це проста навчальна програма: вона переводить дату в кількість секунд від 1970 і навпаки.

Щось я не побачив ще жодного робочого коду на дельфі, що працює під лінуксом  ;D
« Змінено: 2006-12-14 13:32:01 від serg_ik »
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Soft

  • Кореспондент
  • ***
  • дописів: 100
  • Карма: +0/-0
  • Чому саме Лінукс?
Re: Системний програміст...
« Відповідей #22 : 2006-12-14 16:27:43 »
А це лише одна процедура з проекту. Виводить зображення з tiff на сторiнку звiту.

Procedure ShowFax(MessageId:integer;var Page: TfrPage;var ShowFaxQuery:TSDQuery;LowQualityPreview:boolean);
var F1:TFileStream;
Var BlobStream:TStream;
var Attr,Filename:Pchar;
var i,j:longword;
var p:PByteArray;
var b,TinyB:TBitMap;
var Tif:Pointer;
var w,h,bw,bh,iw:longword;
var raster:array of longword;
var frpic:TfrPictureView;
var XRes,Yres:single;
var Ypos:longword;
var ReadResult:integer;
var CurrentPageNumber:integer;
var TinyRect:TRect;

  procedure WritePageNumberOnBitmap(var SBitmap:TBitMap;SPageNumber,FaxOrientation:integer);
  var PSize:TSize;
  var TextPageNumber:string;
  var LB:Tbitmap;
  var Rect:TRect;
  begin
  if SystemVariables.PrintPositionPageNumber<>'0' then
    begin
    LB:=Tbitmap.Create;
    //297 высота
    //210 ширина
    //20 отступ снизу
    LB.Canvas.Font.Size:=16;
    //
    TextPageNumber:=IntToStr(SPageNumber);
    PSize:=LB.Canvas.TextExtent(TextPageNumber);
    //
    LB.Height:=PSize.cy;
    LB.Width:=PSize.cx;
    LB.Canvas.TextOut(0,0,TextPageNumber);

    if (FaxOrientation=0) or (FaxOrientation=2) then
      begin
      //сверху страницы
      if (SystemVariables.PrintPositionPageNumber='1') then
        Rect.Top:=Trunc((SBitmap.Height/DYmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1);
      //снизу страницы
      if (SystemVariables.PrintPositionPageNumber='2') then
        Rect.Top:=SBitmap.Height-(Trunc((SBitmap.Height/DYmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1)+PSize.cy*Trunc((SBitmap.Height/DYmm)/3){отступ текста});
      //
      Rect.Left:=(SBitmap.Width-(PSize.cx*Trunc((SBitmap.Width/DXmm)/3))) div 2;
      Rect.Right:=Rect.Left+LB.Width*Trunc((SBitmap.Width/DXmm)/3);
      Rect.Bottom:=Rect.Top+LB.Height*Trunc((SBitmap.Height/DYmm)/3);
      end;
    //
    if (FaxOrientation=1) or (FaxOrientation=3) then
      begin
      //сверху страницы
      if (SystemVariables.PrintPositionPageNumber='1') then
        Rect.Top:=Trunc((SBitmap.Height/DXmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1);
      //снизу страницы
      if (SystemVariables.PrintPositionPageNumber='2') then
        Rect.Top:=SBitmap.Height-(Trunc((SBitmap.Height/DXmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1)+PSize.cy*Trunc((SBitmap.Height/DXmm)/3){отступ текста});
      //
      Rect.Left:=(SBitmap.Width-(PSize.cx*Trunc((SBitmap.Width/DYmm)/3))) div 2;
      Rect.Right:=Rect.Left+LB.Width*Trunc((SBitmap.Width/DYmm)/3);
      Rect.Bottom:=Rect.Top+LB.Height*Trunc((SBitmap.Height/DXmm)/3);
      end;
    //
    SBitmap.Canvas.StretchDraw(Rect,LB);
    //
    LB.Free;
    end;
  end;

begin
  Application.ProcessMessages;
  CurrentPageNumber:=0;

  ShowFaxQuery.Active:=False;
  ShowFaxQuery.SQL.Clear;
  ShowFaxQuery.SQL.Add('select fax from faxmessages where id=:id;');
  ShowFaxQuery.ParamByName('id').AsInteger:=MessageId;
  ShowFaxQuery.Active:=True;
  if (ShowFaxQuery.RecordCount>0) then
    begin
    CheckTempDir;
    Filename:=Pchar(ExtractFilePath(Application.EXEName)+'temp\'+'tmp#'+IntToStr(MessageId)+'#tif.tif');

    //загружаем в поток
    BlobStream:=ShowFaxQuery.CreateBlobStream(ShowFaxQuery.FieldByName('fax'),bmRead);
    F1:=TFileStream.Create(Filename,fmCreate);
    F1.CopyFrom(BlobStream,0);
    F1.Free;
    BlobStream.Free;

    ShowFaxQuery.Active:=False;
    ShowFaxQuery.SQL.Clear;

    //открываем в бмп
    Attr:='rw';
    tif:=TiffOpen(Filename,Attr);
    //
    frpic:=TfrPictureView(Page.FindObject('Picture1'));
    frpic.FillColor:=clWhite;
    frpic.IsPrinting:=False;
    //
    if tif<>nil then
      begin
      repeat
        TiffGetField(tif,TIFFTAG_IMAGEWIDTH,Addr(w));
        TiffGetField(tif,TIFFTAG_IMAGELENGTH,Addr(h));
        TiffGetField(tif,TIFFTAG_XRESOLUTION,Addr(XRes));
        TiffGetField(tif,TIFFTAG_YRESOLUTION,Addr(Yres));

        SetLength(raster,w*h+1);
        case (FaxOrientation) of
        0:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPLEFT,0);
        1:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPRIGHT,0);
        2:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_BOTRIGHT,0);
        3:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_BOTLEFT,0)
        else
          ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPLEFT,0);
        end;

        b:=TBitMap.Create;
        b.pixelformat:=pf8bit;
        b.Canvas.Pen.Color:=clWhite;
        b.Canvas.Brush.Color:=clWhite;
        b.Transparent:=false;
        //
        if (FaxOrientation=0) or (FaxOrientation=2) then
          begin
          b.width:=Trunc(A4InchWidth*Xres);
          b.height:=Trunc(A4InchHeight*Yres);
          end;
        //
        if (FaxOrientation=1) or (FaxOrientation=3) then
          begin
          b.width:=Trunc(A4InchHeight*Yres);
          b.height:=Trunc(A4InchWidth*Xres);
          end;
        //
        Ypos:=0;
        if ReadResult<>0 then
          begin
          repeat
            //
            if ((Trunc(A4InchHeight*Yres)+Ypos)<=h) then bh:=(Trunc(A4InchHeight*Yres)-1) else bh:=h-1-Ypos;
            //
            if (Trunc(A4InchWidth*Xres)<=w) then bw:=(Trunc(A4InchWidth*Xres)-1) else bw:=w-1;
            //
            if Ypos<>0 then
              b.Canvas.Rectangle(0,0,b.Width,b.Height);
            //
            if (FaxOrientation=0) or (FaxOrientation=2) then
              begin
              //
              for i:=0 to bh do
                begin
                p:=B.ScanLine[i];
                iw:=(i+Ypos)*w;
                for j:=0 to bw do
                  p[j]:=Raster[iw+j];
                end;
              end;
            //
            if (FaxOrientation=1) or (FaxOrientation=3) then
              begin
              for i:=0 to bw do
                begin
                p:=B.ScanLine[i];

                for j:=0 to bh do
                p[j]:=Raster[(j+Ypos)*w+i];
                end;
              end;
            //
            inc(CurrentPageNumber);
            WritePageNumberOnBitmap(b,CurrentPageNumber,FaxOrientation);
            //assig low quality image to save memory usage
            if LowQualityPreview then
              begin
              TinyB:=TBitmap.Create;
              TinyB.Height:=Trunc((b.Height*50)/YRes);
              TinyB.Width:=Trunc((b.Width*50)/XRes);
              TinyRect.Left:=0;TinyRect.Top:=0;
              TinyRect.Right:=TinyB.Width;
              TinyRect.Bottom:=TinyB.Height;
              TinyB.Canvas.StretchDraw(TinyRect,b);
              frpic.Picture.Bitmap:=TinyB;
              TinyB.Free;
              end
            else
              begin
              frpic.Picture.Bitmap:=b;
              end;
            //
            frpic.Picture.Bitmap.Monochrome:=True;
            frpic.Picture.Bitmap.PixelFormat:=pf1bit;
            //
            Page.ShowBandByName('MasterData1');
            //
            Ypos:=Ypos+Trunc(A4InchHeight*Yres);
          //2 Дюйма отбрасываем
          until ((Ypos+Trunc(2*Yres))>h);
          end
        else
          begin
          b.Canvas.Rectangle(0,0,b.Width,b.Height);
          b.Canvas.Font.Size:=36;
          b.Canvas.Pen.Color:=clBlack;
          b.Canvas.TextOut(Trunc(2.5*Xres),Trunc(5*Yres),'Помилка вiдкриття сторiнки');
          //
          frpic.Picture.Bitmap:=b;
          Page.ShowBandByName('MasterData1');
          end;
        //
        SetLength(raster,0);
        b.Free;
      until (TiffReadDirectory(tif)=0);
      end;
    //сбрасываем ориентацию факса
    FaxOrientation:=0;
    //закрываем тифф
    if tif<>nil then
      TiffClose(tif);
    //удаляем
    DeleteFile(Filename);
    end;
end;
« Змінено: 2006-12-14 21:52:29 від Praporshic »

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Системний програміст...
« Відповідей #23 : 2006-12-14 17:24:42 »
Ню-ню і кого ця процедура має чомусь навчити  ;D
Хіба показати на скільки довжелезним і заплутаним код буває в дельфи.[smiley=2vrolijk_08.gif]
Ну поясніть мені: яку користь людству принесе те зображення tiff (а чому не jpg,png) на сторінці звіту?
Подивитись довжелезний код, який не знати чого стосується? То для цього вже існує програмка gtk-demo, яка сама видасть код для того, щоб вивести зображення на сторінку [smiley=cool.gif]
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній AEX_CHECKER

  • Новачок
  • *
  • дописів: 21
  • Карма: +0/-0
  • I Love YaBB 2!
Re: Системний програміст...
« Відповідей #24 : 2006-12-17 00:38:42 »
Я просто дурію: в нас ДЕЛЬФІСТА назвали системним програмістом  ;D На мою думку, тут зайвим було не тільки "системним"  ;) При чому мені навть в голову не стукнуло б назватися системним програмістом, не зважаючи на те, що C вважається мовою системного програмування, оскільки не писав жодної дровеняки, а лише кілька бібліотек (які корисні лише мені ::) ).
Для тих хто не курсі :)
Система (system) - сукупність об`єктів і відношень між ними, що утворюють єдине ціле.
Інформаційна система (англ. Information system) - автоматизована система, комп'ютерна мережа, система зв'язку - сукупність організаційних і технічних засобів для збереження та обробки інформації з метою забезпечення інформаційних потреб користувачів. Таке визначення може бути задовільним тільки при самій узагальненій і неформальній точці зору і підлягає подальшому уточненню.
...
Найдавнішими і найпоширенішими ІС слід вважати бібліотеки. І, дійсно, здавна в бібліотеках збирають книжки (або їх аналоги), зберігають їх, дотримуючись певних правил, створюють каталоги різного призначення для полегшення доступу до книжкового фонду. Видаються спеціальні журнали та довідники, що інформують про нові надходження, ведеться облік видачі.
...
 ;)
« Змінено: 2006-12-17 00:39:28 від AEX_CHECKER »

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Системний програміст...
« Відповідей #25 : 2006-12-18 18:46:23 »
Цитата
Система (system) - сукупність об`єктів і відношень між ними, що утворюють єдине ціле.
Тоді виходить, що системним може бути і програміст на Java-Script  [smiley=am.gif]
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній AEX_CHECKER

  • Новачок
  • *
  • дописів: 21
  • Карма: +0/-0
  • I Love YaBB 2!
Re: Системний програміст...
« Відповідей #26 : 2006-12-29 06:11:28 »
Цитата
Система (system) - сукупність об`єктів і відношень між ними, що утворюють єдине ціле.
Тоді виходить, що системним може бути і програміст на Java-Script  [smiley=am.gif]

# 1
Програміст (англ. programmer) — людина, що займається програмуванням (див. п.2), виконує розробку програмного забезпечення (в простіших випадках — окремих програм).

# 2
Програмування — процес створення комп'ютерних програм та/або програмного забезпечення. Програмування поєднує в собі елементи інженерії (існує навіть відповідна спеціальна галузь інженерії - програмна інженерія (англ. "software engineering")), фундаментальних наук (перш за все математики) і мистецтва.
У більш вузькому значенні програмування розглядається як кодування — реалізація у вигляді програми одного чи кількох взаємопов'язаних алгоритмів (у сучасних умовах це здійснюється з застосуванням мов програмування). У ширшому сенсі процес програмування охоплює і створення, тобто розробку, алгоритмів, і аналіз потреб майбутніх користувачів програмного забезпечення.

#3
Вище наведене означає - НЕ_ВАЖЛИВО на "чому" ти пишеш, ВАЖЛИВО "як" ти це робош.

    Ти на шляху.
    Щоб перемогти,
    Ти повинен бути всеозброяний.
    Хто, допоможе тобі?
:)

P.S.
Півроку тому, я закінчив розробку віконної системи з всякими драг-ен-дроп_ами і тому подібне, саме на ЯваСкрипт_ах для ВогнеЛис_а. Кінцевий результат вразив всіх моїх знайомих, майже, всі змінили думку про могутність ЯваСкрипт_ів.  ;)
« Змінено: 2006-12-29 06:46:30 від AEX_CHECKER »

Відсутній AEX_CHECKER

  • Новачок
  • *
  • дописів: 21
  • Карма: +0/-0
  • I Love YaBB 2!
Re: Системний програміст...
« Відповідей #27 : 2006-12-29 06:39:13 »
Цитата
Система (system) - сукупність об`єктів і відношень між ними, що утворюють єдине ціле.
Тоді виходить, що системним може бути і програміст на Java-Script  [smiley=am.gif]
:) "системний_програміст", чи "не_системний_програміст" ... :)
Історично склалось так, що після розпаду союзу було миттєво_втрачено Культуру Кібернетики: інженери в білих халати, машинні зали, а разом з ними і ієрархію спеціалістів, і розуміння цієї шєрархії. Натомість з'явились прОгрАмісти, які досі не можуть розібратися в термінології. Колись давно, були Постановник_Задач, Інженер_Автоматизації, ..., напевно, це - системні_програмісти. А Кодери - людини, що втілюют (кодують) "алгоритм" ПЗ задопомогою мови програмування - це просто_програмісти. :)
« Змінено: 2006-12-29 06:40:56 від AEX_CHECKER »

Відсутній Cthulhu

  • Кореспондент
  • ***
  • дописів: 183
  • Карма: +0/-0
Re: Системний програміст...
« Відповідей #28 : 2006-12-29 12:44:31 »
Історично склалось так, що після розпаду союзу було миттєво_втрачено Культуру Кібернетики: інженери в білих халати, машинні зали, а разом з ними і ієрархію спеціалістів, і розуміння цієї шєрархії [...]
Це ви про ту культуру, яка самотужки майже нічого не винайшла і жила за рахунок західних технологій виключно на благо ВПК? Ню-ню. А щодо класифікації... тут якось lvm давав хороше посилання на цю тему, тільки не пам'ятаю де. У всякому разі, вона існує (хоч і дуже нечітка), і не має жодного відношення до "білих халатів", а пов'язана скоріше з самоідентифікацією.

І, між іншим, ніколи не мала. Галузь ІТ в її сучасному вигляді розвинулась не із запланових військових розробок, а з одинаків, які мали розум і сміливість спробувати щось зробити не за планом, заставити машину зробити якийсь ніби й нікому не потрібний трюк. В Стівена Леві це все дуже добре описано...

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Системний програміст...
« Відповідей #29 : 2007-01-15 11:36:09 »
Півроку тому, я закінчив розробку віконної системи з всякими драг-ен-дроп_ами і тому подібне, саме на ЯваСкрипт_ах для ВогнеЛис_а. Кінцевий результат вразив всіх моїх знайомих, майже, всі змінили думку про могутність ЯваСкрипт_ів.  ;)

Ну не ява організувала драгендропи а GTK (на базі якої Вогнелис і сидить), а робила вона це не без допомоги GTK, що в свою чергу працювало вже аж ніяк не без допомоги X-серверу, який також в свою чергу є лише надбудовою... і загнуло ся б це все без гарного ядра  ;D
Я теж колись балувався жаба скриптом - поки не набридло. Звичайнісіннька об'єктна мова програмування, використовує можливості браузера - поза нього не вискочить ;)
« Змінено: 2007-01-15 11:37:02 від serg_ik »
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.