Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/30: Рейтинг темы: голосов - 30, средняя оценка - 4.93
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
1

Таблица на free vision

22.09.2012, 16:54. Показов 5543. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо реализовать таблицу и некоторые функции, такие как выдача всех строк таблицы, поиск в колонке по ключевому слову, добавление строки. Опыт работы во free vision отсутствует. Если есть хоть какой-нибудь (не обязательно работы с таблицей) рабочий исходник буду благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2012, 16:54
Ответы с готовыми решениями:

Существует ли документация по Free Vision?
Или какие то уроки? Просто в сети даже относительно Turbo Vision информации маловато. Добавлено...

ПодТаблицы с данными(Таблица-Таблица-Таблица-Таблица) и наследованием
Имеется такая база с таблицами Район-МО-Цель-Зачача. Несколько вариантов связей передумал уже, но...

Free DNS + free hosting?
Подскажите есть ли free dns+free hosting? Надо зарегерить домен, но регистратор просит сначала...

Отзывы о 3D vision.
Ну как расскажите как вам 3D vision хорош или плох(нравиться или тет).У кого 3 моника ? и кто уже...

30
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
22.09.2012, 18:33 2
Возьми любой Турбо-паскалевский дистрибутив (6-ой или 7-ой версии), там в папке \EXAMPLES\DOCDEMOS есть примеры использования TurboVision. Практически без изменений компилируются в FPC.
0
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
22.09.2012, 21:17  [ТС] 3
удалось откомпилить след. код:
Pascal
1
2
3
4
5
6
7
8
uses App;
var
 Table: TApplication;
begin
 Table.Init; 
 Table.Run;
 Table.Done;
end.
Далее нашел в инете табличный интерфейс, исходник в приклепленном файле. Откомпилить не удается . Fpc выплевывает след. вещь:
Compiling tables.pas
tables.pas(170,58) Warning: Some fields coming after "Store" weren't initialized
tables.pas(174,53) Warning: Some fields coming after "Store" weren't initialized
tables.pas(179,52) Warning: Some fields coming after "Store" weren't initialized
tables.pas(191,27) Warning: Function result does not seem to be set
tables.pas(314,3) Note: Local variable "D" not used
tables.pas(315,3) Note: Local variable "R" not used
tables.pas(316,3) Note: Local variable "I" not used
tables.pas(362,3) Note: Local variable "ZZ" is assigned but never used
tables.pas(550,14) Note: Local variable "X" not used
tables.pas(550,16) Note: Local variable "Y" not used
tables.pas(905,16) Error: Identifier not found "MaxAvail"
tables.pas(919,32) Error: Identifier not found "long2str"
tables.pas(922,28) Error: Identifier not found "Trim"
tables.pas(938,46) Error: Incompatible types: got "Constant String" expected "Char"
tables.pas(939,46) Error: Incompatible types: got "Constant String" expected "Char"
tables.pas(949,4) Fatal: There were 5 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode (normal if you did not specify a source file to be compiled)
Вложения
Тип файла: zip tables.zip (8.5 Кб, 11 просмотров)
0
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
22.09.2012, 21:36  [ТС] 4
кому лень распаковывать архив, листинг интерфейса:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
{$X+} { расширенный синтаксис включить }
{$IFNDEF Ver60}
{$T-} { проверку типов выключить }
{$ENDIF}
unit Tables;
interface
 
uses App, Objects, Drivers, Views, Dialogs, Strings;
 
Const CSheet=#6#7#8#9#10;       {Палитра для объекта TSheet}
      CCellPointer=#11#12#13#14;{-"-для объекта TCellPointer}
{      CTableWindow=CBlueWindow+}
      cmLeaveCell=255;
      cmMovePointer=254;
      cmEditCell=253;
Const EnterReaction:(erGoRight,erGoDown,erNextLine)=erGoDown;
Type
     PTable = ^TTable;
     PGroupedScroller = ^TGroupedScroller;
     PSheet = ^TSheet;
     PCellPointer = ^TCellPointer;
     TTable = object(TGroup)
                Delta:TPoint;
                Sheet:PSheet;
                HTitle,
                VTitle:PGroupedScroller;
                CellPointer:PCellPointer;
                HScrollBar:PScrollBar;
                VScrollBar:PScrollBar;
                Constructor Init(var Bounds:TRect;ASheet:PSheet;
                                 AHTitle,AVTitle:PGroupedScroller;
                                 AHScrollBar,AVScrollBar:PScrollBar);
                Constructor Load(var S:TStream);
                Procedure Store(var S:TStream);
                Procedure SetState(AState:Word;Enable:Boolean);virtual;
                {Скрывает/показывает ScrollBar'ы при необходимости}
 
                Procedure HandleEvent(Var Event:TEvent);virtual;
                {Перемещает Указатель в соответствии с событиями от
                 полос прокрутки}
 
                Procedure Awaken; virtual;
 
                procedure UpDate;
                { Вызывается, если значения в таблице были изменены }
 
                procedure Print(var F       : text;        { файл }
                       Width, Height,         { ширина/высота страницы }
                       Left, Top , Bottom     { отступ слева/сверху/снизу }
                                            : integer);
                { Печатает текущую таблицу }
              end;
 
     {Отличается от TScroller только тем, что не пытается показывать/скрывать
      ScrollBarы при изменении состояния}
     TGroupedScroller = object(TScroller)
                          Procedure SetState(AState:Word;Enable:Boolean);virtual;
                          function Print(i, Start, Finish : integer) : PChar; virtual;
                          function GetHeight:integer;virtual;
                        end;
 
     TCellJust=(cjLeft,cjCenter,cjRight);
     TCellProt=(cpNormal,{Ячейку можно редактировать внутри курсора}
                cpComplex,{Ячейку можно редактировать, но то, что следует
                           редактировать не совпадает с тем, что видно на
                           экране}
                cpProtected);{Ячейку вообще нельзя изменять}
 
     TSheet = object(TGroupedScroller)
                {TScroller.Delta хранит первую ячейку на экране}
 
                CurCell:TPoint;{Смещение Текущей ячейки относительно Delta}
                LastColumn:Integer;{Последняя ячейка на экране}
                Constructor Load(var S:TStream);
                Procedure Store(var S:TStream);
                Constructor Init(ALimitX,ALimitY:Integer);
                                                {Размеры таблицы}
                Procedure Draw;virtual;
                Procedure HandleEvent(var Event:TEvent);virtual;
                {Обрабатывает события от мыши и в случае если оно
                 произошло, вырабатывает сообщение cmLeaveCell}
 
                Function GetCurrentWidth:Integer;
                {Возвращает ширину текущей колонки}
 
                Function GetX(Column:Integer):Integer;
                {Возвращает абсолютную позицию текущей колонки в таблице}
 
                Function GetCurrentX:Integer;
                Function GetCurrentY:Integer;
                {Возвращает экранные координаты текущей ячейки в координатах
                 владельца}
 
                Function CurrentX:Integer;
                Function CurrentY:integer;
                {Положение текущей ячейки в таблице}
 
                {Абстрактные методы, которые следует переопределить
                 при создании конкретного объекта}
                Function GetWidth(Column:Integer):Integer;Virtual;
                {Возвращает ширину указанной колонки 0-based }
 
                Function GetValue(X,Y:Integer):String;Virtual;
                {Возвращает строковое представление указанной ячейки}
 
                Function GetFormula(X,Y:Integer):String;virtual;
                {Возвращает редактируемое представление ячейки с классом
                 защиты cpComplex}
 
                Function GetProtection(X,Y:Integer):TCellProt;virtual;
                {Возвращает класс защиты ячейки}
 
                Function CellJust(X,y:Integer):TCellJust;virtual;
                {Возвращает тип выравнивания значения в ячейке}
 
                Function ChangeValue(X,Y:Integer;value:String):Boolean;virtual;
                {Изменяет содержимое указанной ячейки или возвращает False,
                 если значение недопустимое.Для ячеек класса cpComplex на
                 входе то, что выдает GetFormula}
 
                Function CellColor(X,Y:Integer):Byte;virtual;
                {Выдает экранные цвета для вывода данной ячейки
                 (для TView.WriteStr) Используется в Draw}
 
                function GetColumn(Poz : integer) : integer;
                { Функция, которая получает позицию в абсолютных
                  координатах, а возвращает номер столбца. }
 
                function SetColumn(Col : integer) : integer;
                { Возвращает абсолютную позицию последнего символа
                  колонки по номеру колонки. }
 
                function Print(i, Start, Finish : integer) : PChar; virtual;
                { печатает i-ую строку таблицы начиная с позиции Start,
                  кончая позицией Finish }
 
              end;
       PCharArray=^TCharArray;
       TCharArray=Array[0..65521] of char;
       {Заголовок таблицы по умолчанию. рисует необходимый кусок из
        текстового буфера размером Width*Height (прямоугольник с левым
        верхним углом Sheet^.GetX(Sheet^.CurCell.X),Sheet^.CurCell.Y и
        размерами Size.X ,Size.Y}
       PHeader = ^THeader;
       THeader = object(TGroupedScroller)
                   Text:PCharArray;
 
                   Constructor Init(Width,Height:Integer; AText:PCharArray);
                   Constructor Load(var S:TStream);
                   Destructor Done;virtual;
                   Procedure Store(var S:TStream);
                   Procedure Draw;virtual;
                   function Print(i, Start, Finish : integer) : PChar; virtual;
                 end;
     {Табличный курсор - строка ввода}
      TCellPointer = object(TInputLine)
                      Changed:Boolean;
                      Protection:TCellProt;
                      Procedure HandleEvent(var Event:TEvent);virtual;
                      Function GetHelpCtx:Word;virtual;
                      {обрабатывает ^S,^D как стрелки}
                      Function Valid(Command:Word):Boolean;virtual;
                      Procedure NewCell(TblX,TblY,ScrX,ScrY,W:Integer);
                      {Переход на другую ячейку}
                      Function GetPalette:PPalette;virtual;
                     end;
Const RCellPointer : TStreamRec=(ObjType:1001;
                                VMTLink:ofs(TypeOf(TCellPointer)^);
                                Load:@TCellPointer.Load;
                                Store:@TCellPointer.Store);
Const RHeader : TStreamRec=(ObjType:1002;
                                VMTLink:ofs(TypeOf(THeader)^);
                                Load:@THeader.Load;
                                Store:@THeader.Store);
 
Const RTable : TStreamRec=(ObjType:1003;
                                VMTLink:ofs(TypeOf(TTable)^);
                                Load:@TTable.Load;
                                Store:@TTable.Store);
 
implementation
{******************* TGroupedScroller *******************************}
Procedure TGroupedScroller.SetState(AState:Word;Enable:Boolean);
begin
 TView.SetState(AState,Enable);
end;
function TGroupedScroller.GetHeight:integer;
begin
 GetHeight:=Limit.Y;
end;
function TGroupedScroller.Print(i, Start, Finish : integer) : PChar;
begin
 
end;
{********************* TTable **************************************}
 
Constructor TTable.Init(var Bounds:TRect;ASheet:PSheet;AHTitle,AVTitle:PGroupedScroller;
                           AhScrollBar,AVScrollBar:PScrollbar);
var R:TRect;
 
begin
 TGroup.Init(Bounds);
 Options:=Options and not ofBuffered;
  GrowMode:=gfGrowHiX+gfGrowHiY;
 EventMask:=EventMask or evMouse;
 if AHTitle<>nil then
 begin
  HTitle:=AHTitle;
  HTitle^.HScrollBar:=AHScrollBar;
  HTitle^.GrowMode:=gfGrowHiX;
  Insert(HTitle);
 end;
 if AVTitle<>nil then
 begin
  VTitle:=AVTitle;
  VTitle^.GrowMode:=gfGrowHiY;
  Insert(VTitle);
  VTitle^.VScrollBar:=AVScrollBar;
 end;
 Sheet:=ASheet;
 Sheet^.HScrollBar:=AHScrollBar;
 Sheet^.VScrollBar:=AVScrollBar;
 Sheet^.Options:=Sheet^.Options or ofPostProcess;
 Insert(Sheet);
 if HTitle<>nil then R.A.y:=hTitle^.Limit.y else R.A.Y:=0;
 if VTitle<>nil then R.A.x:=VTitle^.Limit.X else R.A.X:=0;
 R.B:=Size;
 Sheet^.ChangeBounds(R);
 With Sheet^ do
  VScrollBar^.SetParams(0,0,Limit.Y-Size.Y,Size.Y,1);
 R.B.X:=R.A.X;
 R.A.X:=0;
 if VTitle<>nil then
  Vtitle^.ChangeBounds(R);
 R.A.X:=R.B.X;
 R.B.X:=Size.X;
 R.B.Y:=R.A.Y;
 R.A.Y:=0;
 HTitle^.ChangeBounds(R);
 R.B.X:=R.A.X;
 R.A.X:=0;
 Insert(New(PView,Init(R)));
 HScrollBar:=AHScrollBar;
 VScrollBar:=AVscrollBar;
 Sheet^.GrowMode:=gfGrowHiX+gfGrowHiY;
 
 R.Assign(0,0,SHeet^.GetWidth(0),1);
 CellPointer:=New(PCellPointer,Init(R,255));
 CellPointer^.EventMask:=CellPointer^.EventMask or evMouse;
 CellPointer^.Options:=CellPointer^.Options or ofPostProcess;
 CellPointer^.EventMask:=CellPointer^.EventMask or evBroadCast;
 Insert(CellPointer);
 CellPointer^.GrowMode:=0;
  CellPointer^.NewCell(0,0,Sheet^.Origin.X,Sheet^.Origin.Y,Sheet^.GetWidth(0));
end;
Constructor TTable.Load(var S:TStream);
begin
 TGroup.Load(S);
 GetPeerViewPtr(S,HScrollBar);
 GetPeerViewPtr(S,VScrollBar);
 GetSubViewPtr(S,Sheet);
 GetSubViewPtr(S,CellPointer);
 GetSubViewPtr(S,VTitle);
 GetSubViewPtr(S,HTitle);
end;
Procedure TTable.AWaken;
begin
 TGroup.Awaken;
 VTitle^.VScrollBar:=VScrollBar;
 HTitle^.HScrollBar:=HScrollBar;
 Sheet^.VScrollBar:=VScrollBar;
 Sheet^.HScrollBar:=HScrollBar;
  CellPointer^.NewCell(0,0,Sheet^.Origin.X,Sheet^.Origin.Y,Sheet^.GetWidth(0));
end;
Procedure TTable.Store(var S:TStream);
begin
 TGroup.Store(S);
 PutPeerViewPtr(S,HScrollBar);
 PutPeerViewPtr(S,VScrollBar);
 PutSubViewPtr(S,Sheet);
 PutSubViewPtr(S,CellPointer);
 PutSubViewPtr(S,VTitle);
 PutSubViewPtr(S,HTitle);
end;
 
procedure TTable.SetState(AState: Word; Enable: Boolean);
 
procedure ShowSBar(SBar: PScrollBar);
begin
  if (SBar <> nil) then
    if GetState(sfActive + sfSelected) then
    begin
      SBar^.Show;
      CellPointer^.Show;
    end
    else begin
      SBar^.Hide;
      CellPointer^.Hide;
    end;
end;
 
begin
  TGroup.SetState(AState, Enable);
  if AState and (sfActive + sfSelected) <> 0 then
  begin
    ShowSBar(HScrollBar);
    ShowSBar(VScrollBar);
  end;
end;
Procedure TTable.HandleEvent(Var Event:TEvent);
{Перемещает Указатель в соответствии с событиями от
полос прокрутки}
var
  D : PDialog;
  R : TRect;
  I : PInputLine;
begin
  if (Event.What=evKeyDown) then
   if Event.KeyCode=kbTab then Event.KeyCode:=kbRight
   else if Event.KeyCode=kbShiftTab then Event.KeyCode:=kbLeft else
   if Event.KeyCode=kbEnter then
    case EnterReaction of
    erGoRight:Event.KeyCode:=kbRight;
    erGoDown:Event.KeyCode:=kbDown;
    erNextLine:begin
               end;
    end;
  if (Event.What=evBroadcast)and(Event.Command=cmScrollBarChanged)and
  not (Event.InfoPtr=HScrollBar)and not (Event.InfoPtr=VScrollBar)
   then exit;
 
 
  TGroup.HandleEvent(Event);
end;
 
procedure TTable.UpDate;
begin
  with Sheet^ do
    CellPointer^.NewCell(CurrentX,CurrentY,GetCurrentX,GetCurrentY,GetCurrentWidth);
 
  ReDraw;
end;
{ --------------------------------------------------------------------- }
procedure TTable.Print(var F       : text;        { файл }
                       Width,                 { ширина страницы }
                       Height,                { высота страницы }
                       Left,                  { отступ слева }
                       Top,                   { отступ сверху }
                       Bottom  : integer);    { отступ снизу }
 
const
  HeightHHeader   = 3;        { то, что сверху (маленькое) }
  WidthVHeader    = 6;        { то, что сбоку (маленькое) }
 
var
  SWidth, EWidth,                   { нач. и кон.  ширина и }
  SHeight, EHeight : integer;       { высота печатаемого куска }
  I                : integer;
  tmpHead          : PChar;
  R                : TRect;
  D                : PWindow;
  ZZ:              integer;
begin
  R.Assign(0,0,28,5);
  New(D, Init(R, 'Wait!', wnNoNumber));
  D^.Options:=D^.Options or ofCentered;
  D^.Flags:=0;
  D^.Palette:=wpGrayWindow;
  R.Assign(1,2,27,3);
  D^.Insert(New(PStaticText, Init(R, ' Подождите! Идет печать...')));
  DeskTop^.Insert(D);
 
  SWidth:=0;
  EWidth:=0;
  SHeight:=0;
  EHeight:=0;
  repeat
    if Height=0 then
      EHeight:=Sheet^.GetHeight
    else if SHeight=0 then { Первая страница }
           if (Height-Top-Bottom-HeightHHeader-
               HTitle^.GetHeight<Sheet^.GetHeight)
           then
             EHeight:=Height-Top-Bottom-HeightHHeader-HTitle^.GetHeight
           else
             EHeight:=Sheet^.GetHeight
         else { Не первая страница }
           if (EHeight+Height-Top-Bottom-HeightHHeader<Sheet^.GetHeight)
           then
             EHeight:=EHeight+Height-Top-Bottom-HeightHHeader
           else
             EHeight:=Sheet^.GetHeight;
 
    if Width=0 then
      EWidth:=Sheet^.SetColumn(Sheet^.Limit.X)
    else if SWidth=0 then { Первый столбец }
           if (Width-Left-WidthVHeader-
               VTitle^.Limit.X-1<Sheet^.SetColumn(Sheet^.Limit.X))
           then
             EWidth:=Sheet^.SetColumn(Sheet^.GetColumn(Width-Left-WidthVHeader-
             VTitle^.Limit.X-1)-1)
           else
             EWidth:=Sheet^.SetColumn(Sheet^.Limit.X)
         else { Не первый столбец }
           if (EWidth+Width-Left-
               WidthVHeader<Sheet^.Setcolumn(Sheet^.Limit.X))
           then
             EWidth:=Sheet^.SetColumn(Sheet^.GetColumn(EWidth+Width-Left-WidthVHeader)-1)
           else
             EWidth:=Sheet^.SetColumn(Sheet^.Limit.X);
 
    { Печатать страницу }
    if SHeight=0 then { Если это первая страница, то печатать шапку }
      for i:=1 to HTitle^.GetHeight do
      begin
        tmpHead:=HTitle^.Print(i, SWidth, EWidth-1);
        if SWidth=0 then write(F, ' ':VTitle^.Limit.X+WidthVHeader)
                    else write(F, ' ':WidthVHeader);
        writeln(F, tmpHead);
        if tmpHead<>Nil then
                          StrDispose(tmpHead);
      end;
 
    { маленькая шапка }
    tmpHead:=Sheet^.Print(-2, SWidth, EWidth);
    if SWidth=0 then write(F, ' ':VTitle^.Limit.X+WidthVHeader)
                else write(F, ' ':WidthVHeader);
    writeln(F, tmpHead);
    if tmpHead<>Nil then FreeMem(tmpHead, EWidth-SWidth+2);
 
    tmpHead:=Sheet^.Print(-1, SWidth, EWidth);
    if SWidth=0 then write(F, ' ':VTitle^.Limit.X+WidthVHeader)
                else write(F, ' ':WidthVHeader);
    writeln(F, tmpHead);
    if tmpHead<>Nil then FreeMem(tmpHead, EWidth-SWidth+2);
 
    tmpHead:=Sheet^.Print(-2, SWidth, EWidth);
    if SWidth=0 then write(F, ' ':VTitle^.Limit.X+WidthVHeader)
                else write(F, ' ':WidthVHeader);
    writeln(F, tmpHead);
    if tmpHead<>Nil then FreeMem(tmpHead, EWidth-SWidth+2);
    { закончили с маленькой шапкой }
 
    for i:=SHeight+1 to EHeight do
    begin
      if SWidth=0 then { Если это первый столбец }
      begin
        tmpHead:=VTitle^.Print(i, SWidth, VTitle^.Limit.X-1);
        write(F, tmpHead);
        ZZ:=StrLen(TmpHead);
        if tmpHead<>Nil then
             StrDispose(tmpHead);
      end;
 
      if i<10 then write(F, '│ 0',i,' │')
              else write(F, '│ ',i,' │');
 
      tmpHead:=Sheet^.Print(i, SWidth, EWidth);
      writeln(F, tmpHead);
      if tmpHead<>Nil then
                   StrDispose(tmpHead);
    end;
    SHeight:=EHeight;
    SWidth:=EWidth;
    writeln(F, #12);
 
    { Напечатан ли последний столбец данной страницы }
    if EWidth=Sheet^.SetColumn(Sheet^.Limit.X) then SWidth:=0;
 
    if EHeight=Sheet^.GetHeight then SHeight:=0;
 
  { Напечатан последний столбец последней страницы? }
  until (EHeight>=Sheet^.GetHeight) and
        (EWidth>=Sheet^.SetColumn(Sheet^.Limit.X));
  { Если нет, то: -> на начало }
 
  DeskTop^.Delete(D);
  Dispose(D, Done);
end;
{ --------------------------------------------------------------------- }
 
{***************** TCellPointer ***************************************}
Procedure TCellPointer.HandleEvent(var Event:TEvent);
begin
 
  if Event.What=evKeyDown then
  Case Event.KeyCode of
  kbLeft,kbRight,kbHome,kbEnd:exit;
  kbAltS+ord(^S):Event.KeyCode:=kbLeft;
  kbAltA+ord(^A):Event.KeyCode:=kbHome;
  kbAltD+ord(^D):Event.KeyCode:=kbRight;
  kbAltF+ord(^F):Event.KeyCode:=kbEnd;
  kbEsc:begin
     With PTable(Owner)^.Sheet^ Do
      NewCell(CurrentX,CurrentY,GetCurrentX,GetCurrentY,GetCurrentWidth);
     ClearEvent(Event);
     Changed:=False;
         exit;
        end;
  kbDel:case Protection of
       cpNormal:Changed:=True;
       cpComplex:begin
                  With PTable(Owner)^.Sheet^ do
                    ChangeValue(CurrentX,CurrentY,'');
                  ClearEvent(Event);
                  exit
                 end;
       cpProtected:ClearEvent(Event)
     end;
  else
 
   if (Event.CharCode<>#0)then
   if (Protection>cpNormal)
    then begin ClearEvent(Event);exit end else Changed:=True;
  end;
  if Event.What and evMouse<>0 then
   begin
    PTable(Owner)^.Sheet^.HandleEvent(Event);
    exit;
  end;
  TInputLine.HandleEvent(Event);
 
  if (Event.What=evBroadCast) then
    if (Event.Command=cmLeaveCell)or(Event.Command=cmScrollBarChanged) then
    begin
      if not Valid(cmLeaveCell) then
        ClearEvent(Event)
    end else
      if Event.Command=cmMovePointer then
      begin
        With PTable(Owner)^.Sheet^ Do
          NewCell(CurrentX,CurrentY,GetCurrentX,GetCurrentY,GetCurrentWidth);
        ClearEvent(Event);
      end;
end;
{обрабатывает ^S,^D как стрелки}
Function TCellPointer.Valid(Command:Word):Boolean;
begin
 if (Command=cmLeaveCell)and(Protection=cpNormal) then
  Valid:=not Changed or PTable(Owner)^.Sheet^.ChangeValue(PTable(Owner)^.Sheet^.CurrentX,
     PTable(Owner)^.Sheet^.CurrentY,Data^)
 else Valid:=TInputLine.Valid(Command);
end;
Function TCellPointer.GetHelpCtx:word;
begin
 GetHelpCtx:=PTable(Owner)^.Sheet^.HelpCtx;
end;
Procedure TCellPointer.NewCell(TblX,TblY,ScrX,ScrY,W:Integer);
{Переход на другую ячейку}
var S:String;X,Y:Integer;
begin
 
  GrowTo(W,1);
 With PTable(Owner)^.Sheet^ do
 begin
  S:=GetValue(TblX,TblY);
  Protection:=GetProtection(TblX,TblY);
  Changed:=False;
 end;
 SetData(S);
 MoveTo(ScrX,ScrY);
end;
Function TCellPointer.GetPalette:PPalette;
const P:String[Length(CCellPointer)]=CCellPointer;
begin
 GetPalette:=@P;
end;
{************************** THeader ************************************}
Constructor THeader.Init(Width,Height:Integer;AText:PCharArray);
var Bounds:TRect;
begin
 Bounds.Assign(0,0,1,1);
 TScroller.Init(Bounds,nil,nil);
 Limit.X:=Width;
 Limit.Y:=Height;
 Text:=AText;
end;
Constructor THeader.Load(var S:TStream);
begin
 TView.Load(S);
 S.Read(Delta,SizeOf(Delta));
 S.Read(Limit,SizeOf(Limit));
 GetMem(Text,Limit.X*Limit.Y);
 S.Read(Text^,Limit.X*Limit.Y);
end;
Procedure THeader.Store(var S:TStream);
begin
 TView.Store(S);
 S.Write(Delta,SizeOf(Delta));
 S.Write(Limit,SizeOf(Limit));
 S.Write(Text^,Limit.X*Limit.Y);
end;
 
Destructor THeader.Done;
begin
 if Text<>NIL then FreeMem(Text,Limit.X*Limit.Y);
 TScroller.Done;
end;
Procedure THeader.Draw;
var Start,Last:Integer;i:Integer;S:String;
begin
 I:=PTable(Owner)^.Sheet^.GetX(Delta.X);
 Start:=Delta.Y*Limit.X+i;
 if Limit.X-i>Size.X then Last:=Size.X else Last:=Limit.X-i;
 FillChar(S[1],Size.X,' ');
 For i:=0 to Pred(Size.Y) Do
 begin
  S[0]:=Chr(Size.X);
  FillChar(S[1],Size.X,' ');
  if Start<Limit.x*Limit.Y then
  Move(Text^[Start],S[1],Last);
  WriteStr(0,i,S,1);
  Inc(Start,Limit.X);
 end;
end;
 
{ ---------------------------------------------------------
 
  Процедура THeader.Print(i, Start, Finish), где i - номер строки
  заголовка, который надо вывести, а SWidth и EWidth - начальная и
  конечная позиция. Процедура возвращает строку, точнее i-ую строку
  верхнего (или не верхнего) хедера, причем не полную, а только начиная
  с SWidth позиции и кончая EWidth позицией.
}
function THeader.Print(i, Start, Finish : integer) : PChar;
var
  Result : PChar;
begin
  if Start>=Finish then Print:=Nil
  else
  begin
    GetMem(Result, Finish-Start+2);
    Move(Text^[(i-1)*Limit.X+Start], Result^, Finish-Start+1);
    Result[Finish-Start+1]:=#0;
    Print:=Result;
  end;
end;
{ --------------------------------------------------------- }
 
{*********************** TSheet ************************************}
Constructor TSheet.Init(ALimitX,ALimitY:Integer);
var Bounds:TRect;
begin
 Bounds.Assign(0,0,1,1);
 TScroller.Init(Bounds,nil,nil);
 Limit.X:=ALimitX;
 Limit.Y:=AlimitY;
 Options:=Options and ofPostProcess;
 GrowMode:=gfGrowHiX+gfGrowHiY;
end;
Function TSheet.GetWidth(Column:Integer):Integer;
{Возвращает ширину указанной колонки}
begin
 GetWidth:=9;
end;
Function TSheet.GetCurrentWidth:Integer;
{Возвращает ширину текущей колонки}
begin
 GetCurrentWidth:=GetWidth(CurrentX);
end;
Function TSheet.GetX(Column:Integer):Integer;
{Возвращает абсолютную позицию текущей колонки в таблице}
var W:Word;I:Integer;
begin
 W:=0;
 for i:=0 to Pred(Column) do
  W:=W+GetWidth(i);
 GetX:=W;
end;
Function TSheet.GetCurrentX:Integer;
{Возвращает экранные координаты текущей ячейки в координатах
владельца}
var W:Word;I:Integer;
begin
  W:=0;
  For i:=Delta.X to Pred(CurrentX) do
   W:=W+GetWidth(i);
  GetCurrentX:=W+Origin.X;
end;
Function TSheet.GetFormula(X,Y:Integer):String;
{Возвращает редактируемое представление ячейки с классом
защиты cpComplex}
begin
 GetFormula:=GetValue(X,Y);
end;
Function TSheet.GetProtection(X,Y:Integer):TCellProt;
{Возвращает класс защиты ячейки}
begin
 GetProtection:=cpNormal;
end;
Function TSheet.GetCurrentY:Integer;
{Возвращает экранные координаты текущей ячейки в координатах
владельца}
begin
  GetCurrentY:=CurCell.Y+Origin.Y;
end;
Function TSheet.CurrentX:Integer;
{Положение текущей ячейки в таблице}
begin
 CurrentX:=Delta.X+CurCell.X;
end;
Function TSheet.CurrentY:integer;
{Положение текущей ячейки в таблице}
begin
 CurrentY:=Delta.Y+CurCell.Y;
end;
Function TSheet.GetValue(X,Y:Integer):String;
{Возвращает строковое представление указанной ячейки}
begin
 GetValue:='';
end;
Function TSheet.CellJust(X,y:Integer):TCellJust;
{Возвращает тип выравнивания значения в ячейке}
begin
 CellJust := cjRight;
end;
{ ------------------------------------------------ }
Function TSheet.ChangeValue(X,Y:Integer;value:String):Boolean;
{Изменяет содержимое указанной ячейки или возвращает False,
если значение недопустимое}
begin
 ChangeValue:=True;
end;
{ ------------------------------------------------ }
Procedure TSheet.Draw;
var i,j,x,w:integer;S,Cell:String;
    just:TCellJust;
begin
  S[0]:=chr(Size.X);
  For j:=0 to Pred(Size.Y) do
   begin
    FillChar(S[1],Size.X, ' ');
    X:=1;
    if j>=Limit.Y then WriteStr(0,j,S,1) else
    begin
     i:=Delta.X;
    While (X<=Size.X)and(I<Limit.X) do
     begin
      Cell:=GetValue(i,j+Delta.Y);
      W:=GetWidth(i);
      Just:=CellJust(i,j+Delta.Y);
    { if Cell<>'' then}
       begin
        if (Length(Cell)>W)and(Just<>cjLeft) then
          Cell:=Copy(Cell,1,W);
        While Length(Cell)<W do
         Case Just of
         cjLeft:Cell:=Cell+' ';
         cjCenter:Cell:=' '+Cell+' ';
         cjRight:Cell:=' '+Cell;
         end;
        if Size.X-X-W+1>0 then
        FillChar(Cell[W+1],Size.X-X-W+1,' ');
 
        WriteStr(X-1,J,Cell,CellColor(i,J+Delta.Y));
      end;
     X:=X+W;
     inc(i);
    end;
    if X<=Size.X then
      WriteChar(X-1,J,' ',1,Size.X-X+1);
   end;
    {WriteStr(0,j,S,1);}
   end;
   if X<=Size.X then LastColumn:=i else
   LastColumn:=i-2;
   HScrollBar^.SetParams(Delta.X,0,Limit.X-1,LastColumn-Delta.X,1);
end;
{ ------------------------------------------------- }
Procedure TSheet.HandleEvent(var Event:TEvent);
{Обрабатывает события от мыши и стрелки и в случае если оно
произошло, вырабатывает сообщение cmLeaveCell}
 
  var MousePoint:TPoint;I:Integer;
  { ------------------------------------ }
  Procedure MovePointer(X,Y:Integer);
  begin
   Event.What:=evBroadCast;
   Event.Command:=cmLeaveCell;
   TPoint(Event.InfoPtr).X:=X;
   TPoint(Event.InfoPtr).Y:=Y;
   PutEvent(Event);
  end;
  { ------------------------------------ }
  Procedure ChangeCellPointer;
  begin
   Message(Owner,evBroadCast,cmMovePointer,nil);
  end;
  { ------------------------------------ }
begin
 TScroller.HandleEvent(Event);
 
 if Event.What=evKeyDown then
 begin
  case Event.KeyCode of
    { Стрелки - если курсор не на краю таблицы, то он перемещается,
      иначе событие передается ScrollBar'ам }
    kbLeft  : if CurCell.X>0 then
                MovePointer(CurCell.X-1,CurCell.Y)
              else exit;
 
    kbRight : if CurCell.X+Delta.X<Pred(Limit.X) then
                if Delta.X+CurCell.X<LastColumn-1 then
                  MovePointer(CurCell.X+1,CurCell.Y)
                else exit;
 
    kbUp    : if CurCell.Y>0 then
                MovePointer(CurCell.X,CurCell.Y-1)
              else exit;
 
    kbDown  : if CurCell.Y+Delta.Y<Pred(Limit.Y) then
                if CurCell.Y<Pred(Size.Y) then
                  MovePointer(CurCell.X,CurCell.Y+1)
                else exit;
    else exit;
  end; { case }
  ClearEvent(Event);
 end
 else if Event.What=evMouseDown then
 begin
  MakeLocal(Event.Where,MousePoint);
  MousePoint.X:=MousePoint.X+GetX(Delta.X);
  i:=Delta.X;
  While GetX(I+1)< MousePoint.X do inc(i);
  if (CurCell.X=I-Delta.X)and(MousePoint.Y=CurCell.Y) then Exit;
  MovePointer(i-Delta.X,MousePoint.Y);
  ClearEvent(Event);
 end else
 if (Event.What=evBroadCast)
  Then
  if (Event.Command=cmLeaveCell) then
  begin
   CurCell.X:=TPoint(Event.InfoPtr).X;
   CurCell.Y:=TPoint(Event.InfoPtr).Y;
   ChangeCellPointer;
   ClearEvent(Event);
  end else
  if Event.Command=cmScrollBarChanged then
  begin
   if Delta.X+CurCell.X>Limit.X-1 then
   CurCell.X:=Limit.X-Delta.X-1;
    ChangeCellPointer;
  end;
end;
{ ---------------------------------------------------- }
Function TSheet.CellColor(X,Y:Integer):Byte;
begin
 CellColor:=1;
end;
Constructor TSheet.Load(var S:TStream);
begin
 TView.Load(S);
 S.Read(Delta,SizeOf(Delta));
 S.Read(Limit,SizeOf(Limit));
 S.Read(CurCell,SizeOf(CurCell));
 S.Read(LastColumn,SizeOf(LastColumn));
end;
Procedure TSheet.Store(var S:TStream);
begin
 TView.Store(S);
 S.Write(Delta,SizeOf(Delta));
 S.Write(Limit,SizeOf(Limit));
 S.Write(CurCell,SizeOf(CurCell));
 S.Write(LastColumn,SizeOf(LastColumn));
end;
{ -------------------------------------------------------------------- }
function TSheet.GetColumn(Poz : integer) : integer;
var
  Result : integer;
begin
  Result:=0;
  while Poz>=0 do
  begin
    Poz:=Poz-GetWidth(Result);
    inc(Result);
  end;
  GetColumn:=Result;
end;
{ -------------------------------------------------------------------- }
function TSheet.SetColumn(Col : integer) : integer;
var
  Result, i : integer;
begin
  Result:=0;
  for i:=1 to Col do
    Result:=Result+GetWidth(i-1);
  SetColumn:=Result;
end;
{ -------------------------------------------------------------------- }
function TSheet.Print(i, Start, Finish : integer) : PChar;
var
  Result : PChar;
  tmpasc : array [0..255] of char;
  j,k    : integer;
  lim    : integer;
  SCol, FCol : integer;
  tmpStr : string;
  Just   : TCellJust;
  tmpInt : integer;
 
begin
  if Start>=Finish then Print:=Nil
  else
  begin
    if MaxAvail<Finish-Start+2 then Print:=Nil
    else
    begin
      GetMem(Result, Finish-Start+2);
      Result[0]:=#0;
      SCol:=GetColumn(Start)-1;
      FCol:=GetColumn(Finish)-1;
 
      for j:=SCol to FCol-1 do
      begin
        tmpInt:=GetWidth(j);
        tmpStr:='';
 
        case i of
          -1 : tmpStr:=long2str(j+1);
          -2 : for k:=1 to tmpInt do
                 tmpStr:=tmpStr+'─';
          else tmpStr:=Trim(GetValue(j,i-1));
        end; { case }
 
        if i=-1 then Just:=cjCenter
                else Just:=CellJust(j,i);
 
        while length(tmpStr)<tmpInt do
          case Just of
            cjLeft   : tmpStr:=tmpStr+' ';
            cjCenter : tmpStr:=' '+tmpStr+' ';
            cjRight  : tmpStr:=' '+tmpStr;
          end;
 
        if length(tmpStr)>tmpInt then
          tmpStr:=Copy(tmpStr,1,tmpInt); { урезать до нормы }
 
        if i=-1 then tmpStr[length(tmpStr)]:='│';
        if i=-2 then tmpStr[length(tmpStr)]:='┼';
                                         { заменить последний символ }
        Result:=StrCat(Result, StrPCopy(tmpasc, tmpStr));
      end;
      Print:=Result;
    end;
  end;
end;
{ -------------------------------------------------------------------- }
 
end.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
22.09.2012, 22:39 5
Странно. У меня ошибки другие:

Код
Compiling f:\programs\pascal\tables.pas
tables.pas(170,58) Warning: Some fields coming after "Store" weren't initialized
tables.pas(174,53) Warning: Some fields coming after "Store" weren't initialized
tables.pas(179,52) Warning: Some fields coming after "Store" weren't initialized
tables.pas(191,27) Warning: Function result does not seem to be set
tables.pas(58,42) Hint: Parameter "i" not used
tables.pas(58,45) Hint: Parameter "Start" not used
tables.pas(58,52) Hint: Parameter "Finish" not used
tables.pas(314,3) Note: Local variable "D" not used
tables.pas(315,3) Note: Local variable "R" not used
tables.pas(316,3) Note: Local variable "I" not used
tables.pas(362,3) Note: Local variable "ZZ" is assigned but never used
tables.pas(550,14) Note: Local variable "X" not used
tables.pas(550,16) Note: Local variable "Y" not used
tables.pas(605,11) Hint: Local variable "S" does not seem to be initialized
tables.pas(100,35) Hint: Parameter "Column" not used
tables.pas(110,40) Hint: Parameter "X" not used
tables.pas(110,42) Hint: Parameter "Y" not used
tables.pas(103,35) Hint: Parameter "X" not used
tables.pas(103,37) Hint: Parameter "Y" not used
tables.pas(113,35) Hint: Parameter "X" not used
tables.pas(113,37) Hint: Parameter "y" not used
tables.pas(116,38) Hint: Parameter "X" not used
tables.pas(116,40) Hint: Parameter "Y" not used
tables.pas(116,50) Hint: Parameter "value" not used
tables.pas(780,4) Error: Illegal type conversion: "Pointer" to "TPoint"
tables.pas(781,4) Error: Illegal type conversion: "Pointer" to "TPoint"
tables.pas(821,35) Hint: Local variable "MousePoint" does not seem to be initialized
tables.pas(833,15) Error: Illegal type conversion: "Pointer" to "TPoint"
tables.pas(834,15) Error: Illegal type conversion: "Pointer" to "TPoint"
tables.pas(905,16) Error: Identifier not found "MaxAvail"
tables.pas(919,32) Error: Identifier not found "long2str"
tables.pas(922,28) Error: Identifier not found "Trim"
tables.pas(949,4) Fatal: There were 7 errors compiling module, stopping
tables.pas(0) Fatal: Compilation aborted
Ну, недостаток функций long2str и Trim - это не проблема, забрал из какого-то пакета:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function long2str(L:LongInt):string;
var serv : string;
begin
  str(L, serv);
  long2str := serv;
end;
 
function Trim(const S: string): string;
var
  i,j : longint;
begin
  i:=1;
  while (i<length(s)) and (s[i]=' ') do
   inc(i);
  j:=length(s);
  while (j>0) and (s[j]=' ') do
   dec(j);
  Trim:=Copy(S,i,j-i+1);
end;
, с нелегальной конвертацией Pointer->TPoint тоже разобрался: описал свой локальный тип:
Pascal
1
2
3
4
5
type
   TMyPoint = record
      X : SmallInt;
      Y : SmallInt;
   end;
, и приводил к нему, а не к Objects.Point. А вот единственная оставшаяся ошибка - отсутствие MaxAvail - это проблема. Убрали эту переменную из FPC, и, насколько мне известно, нет подходящего способа определить количество доступной памяти.

Почему же у тебя на конвертацию Pointer->TPoint не вякает компилятор?
0
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
22.09.2012, 23:21  [ТС] 6
Цитата Сообщение от UI Посмотреть сообщение
Почему же у тебя на конвертацию Pointer->TPoint не вякает компилятор?
может версии компиляторов другие
мой Free Pascal Compiler version 2.4.0-2 [2010/02/20] for x86_64
ОС GNU/Linux Debian Squeeze 2.6.32-5-amd64

Думаю ошибка появится после устранения других

Добавлено через 2 минуты
Цитата Сообщение от UI Посмотреть сообщение
отсутствие MaxAvail - это проблема. Убрали эту переменную из FPC, и, насколько мне известно, нет подходящего способа определить количество доступной памяти.
Вот это уже EPIC FAIL... буду искать другие примеры
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
22.09.2012, 23:46 7
Ясно. 64 бита. Тогда да, так и должно быть, размеры TPoint и Integer-а совпадают, конвертация возможна.
Цитата Сообщение от freeax Посмотреть сообщение
буду искать другие примеры
Зря потратишь время. Во всех примерах так или иначе присутствует либо MemAvail, либо MaxAvail. Начиная с самых простых, которые идут как демо от TV. Попробуй просто не обрабатывать ошибку нехватки памяти, тебе в любом случае памяти доступно гораздо больше, чем под 16-битным Паскалем, и вряд ли ты ее всю заберешь...
0
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
23.09.2012, 00:48  [ТС] 8
господа, нашел реализацию процедуры открытия файла:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure FileOpen; {Открывает файл данных} 
var
 PF: PFileDialog; {Диалоговое окно выбора файла} 
 Control: Word; 
 s: PathStr; 
begin
 {Создаем экземпляр динамического объекта:} 
 New(PF, Init('*.dat','Выберите нужный файл:','Имя файла',fdOpenButton,0)); 
 {С помощью следующего оператора окно выводится на экран и результат работы пользователя с ним помещается в переменную Control:} 
 Control := DeskTop^.ExecView(PF); 
 {Анализируем результат запроса:} 
 case Control of 
  StdDlg.cmFileOpen, cmOk: 
   begin {Пользователь указал имя файла:}
    PF^.QetFileName(s) ; {s содержит имя файла}
    {Открыть файл}
   end;
 end; {case Control} 
 Dispose (PF, Done) {Уничтожаем экземпляр} 
end; {FileOpen}
при компиляции ошибка


Compiling note.pas
note.pas(85,20) Error: Identifier not found "cmFileOpen"
note.pas(85,20) Error: Constant Expression expected
note.pas(87,9) Error: identifier idents no member "QetFileName"
note.pas(133) Fatal: There were 3 errors compiling module, stopping
Fatal: Compilation aborted

модуль StdDlg указан:

Pascal
1
uses StdDlg;
Как решить?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.09.2012, 01:09 9
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uses ..., app, fvconsts, stddlg;
 
procedure FileOpen; {Открывает файл данных} 
var
 PF: PFileDialog; {Диалоговое окно выбора файла} 
 Control: Word; 
 s: PathStr; 
begin
 {Создаем экземпляр динамического объекта:} 
 New(PF, Init('*.dat','Выберите нужный файл:','Имя файла',fdOpenButton,0)); 
 {С помощью следующего оператора окно выводится на экран и результат работы пользователя с ним помещается в переменную Control:} 
 Control := DeskTop^.ExecView(PF); 
 {Анализируем результат запроса:} 
 case Control of 
  cmFileOpen, cmOk: // Это описано в FVconsts, а не в StdDlg
   begin {Пользователь указал имя файла:}
    PF^.GetFileName(s) ; {s содержит имя файла}
    {Открыть файл}
   end;
 end; {case Control} 
 Dispose (PF, Done) {Уничтожаем экземпляр} 
end; {FileOpen}
1
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
23.09.2012, 01:36  [ТС] 10
Цитата Сообщение от UI Посмотреть сообщение
Pascal
1
2
3
uses ..., app, fvconsts, stddlg;
  cmFileOpen, cmOk: // Это описано в FVconsts, а не в StdDlg
{FileOpen}
Спасибо большое! На будущее как искать в каком модуле описаны методы?

Добавлено через 13 минут
и в догонку к тому вопросу

процедура смены директории
Pascal
1
2
3
4
5
6
7
8
9
10
11
procedure TNotebook.ChangeDir;
{Изменяет текущий каталог} 
var
 PD: PChDirDialog; {Диалоговое окно смены каталога/диска}
 Control: Word; 
begin
 New(PD, Init(cdNormal,0));{Создаем диалоговое окно}
 Control := DeskTop^.ExecView(PD);{Используем окно}
 ChDir(PD^.Dirlnput^.Data^);{Устанавливаем новый каталог}
 Dispose(PD, Done){Удаляем окно из кучи}
end; {TNotebook.ChangeDir}
при компиляции дает следующую ошибку:
note.pas(136,12) Error: identifier idents no member "Dirlnput"
что делать?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.09.2012, 02:16 11
Цитата Сообщение от freeax Посмотреть сообщение
как искать в каком модуле описаны методы?
Поиском по исходникам, разумеется
Цитата Сообщение от freeax Посмотреть сообщение
при компиляции дает следующую ошибку:
Насколько я помню TV, оно и там не скомпилируется. Надо сначала вытянуть строку из PD^DirInput^.Data, и только потом ее передавать в качестве параметра ChDir.
0
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
23.09.2012, 02:59  [ТС] 12
не могу разобраться в след. коде:
PureBasic
1
2
3
4
5
6
7
type
 PInterior = ATInterior; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 TInterior = object (TScroller)
 constructor Init(var Bounds: TRect; HS,VS: PScrollBar);
 procedure Draw; virtual;
 procedure ReadFile; 
end;
компилятор ругается на ATInterior:
note.pas(32,24) Error: Identifier not found "ATInterior"
note.pas(32,24) Error: Error in type definition

Помогите, плииииз!!!!

Добавлено через 7 минут
Цитата Сообщение от UI Посмотреть сообщение
Надо сначала вытянуть строку из PD^DirInput^.Data, и только потом ее передавать в качестве параметра ChDir.
что это значит?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.09.2012, 03:01 13
Не ATInterior, а просто TInterior, обычная практика - сначала описывается тип-указатель, потом - то, на что он указывает.

Добавлено через 2 минуты
Цитата Сообщение от freeax Посмотреть сообщение
что это значит?
Прочесть в строку из Data, и потом ее передать дальше. Компилятора под рукой нет, но вот это должно быть нормально:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TNotebook.ChangeDir;
{Изменяет текущий каталог} 
var
 PD: PChDirDialog; {Диалоговое окно смены каталога/диска}
 Control: Word; 
 s : string;
begin
 New(PD, Init(cdNormal,0));{Создаем диалоговое окно}
 Control := DeskTop^.ExecView(PD);{Используем окно}
 s := PD^.Dirlnput^.Data^;
 ChDir(s);{Устанавливаем новый каталог}
 Dispose(PD, Done){Удаляем окно из кучи}
end; {TNotebook.ChangeDir}
1
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
23.09.2012, 04:22  [ТС] 14
[QUOTE=freeax;3477881]не могу разобраться в след. коде:
PureBasic
1
2
3
4
5
6
7
type
 PInterior = ATInterior; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 TInterior = object (TScroller)
 constructor Init(var Bounds: TRect; HS,VS: PScrollBar);
 procedure Draw; virtual;
 procedure ReadFile; 
end;
компилятор ругается на ATInterior:
note.pas(32,24) Error: Identifier not found "ATInterior"
note.pas(32,24) Error: Error in type definition

Помогите, плииииз!!!!

извиняюсь, вопрос снят, совсем крыша едет - сутки не спал не спал

Добавлено через 12 минут
Цитата Сообщение от UI Посмотреть сообщение
Не ATInterior, а просто TInterior, обычная практика - сначала описывается тип-указатель, потом - то, на что он указывает.

Добавлено через 2 минуты
Прочесть в строку из Data, и потом ее передать дальше. Компилятора под рукой нет, но вот это должно быть нормально:

Pascal
1
2
3
4
5
6
7
8
9
10
procedure TNotebook.ChangeDir;
{Изменяет текущий каталог} 
var
 ...
 s : string;
begin
 ...
 s := PD^.Dirlnput^.Data^;
 ChDir(s);{Устанавливаем новый каталог}
 ...
разобрался, дело было в том, что в исходнике опечатка была, не PD^.Dirlnput^.Data^, а PD^.Dirinput^.Data^

работоспособный код:
Pascal
1
2
3
4
5
...
begin
 ...
 ChDir(PD^.Dirinput^.Data^); {Устанавливаем новый каталог}
 ...
Добавлено через 10 минут
вот такой вопрос, можно ли в free pascal и в частности в free vision создавать прототипы функций?

Добавлено через 54 минуты
После того как стал использовать коллекции (PS: PStringCollection вместо массивов программа при исполнении падает с ошибкой:
Runtime error 216

в чем может быть причина?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.09.2012, 10:18 15
Где-то передаешь неинициализированный указатель при работе с коллекцией ( PStringCollection ) или с потоком ( TStream ).
0
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
23.09.2012, 20:28  [ТС] 16
Цитата Сообщение от UI Посмотреть сообщение
Где-то передаешь неинициализированный указатель при работе с коллекцией ( PStringCollection ) или с потоком ( TStream ).
помогите разобраться плиз, вот код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
program HelpS;
{Программа обслуживает файлы данных "справочной системы"}
uses App, Objects, Menus, Drivers, Views, StdDlg, FVconsts, DOS, Memory, Dialogs;
const
 {Команды для обработчиков событий}
 cmWork = 203; {Обработать данные}
 cmDOS = 204; {Временно выйти в ДОС}
 WinCom1: TCommandSet = [cmSave, cmWork]; {Множество временно недоступных команд}
 WinCom2: TCommandSet = [cmOpen];
 
 LName = 25; {Длина поля Name}
 LPhone = 11; {Длина поля Phone}
 LAddr = 40; {длина поля Addr}
 
 LLine = LName+LPhone+LAddr; {Длина строки} 
 
type
 DataType = record {Тип данных в файле}
 Name: String[LName]; {Имя}
 Phone: String[LPhone]; {Телефон} 
 Addr: String[LAddr]; {Адрес}
end;
 
type
 PWorkWin = ^TWorkWin; 
 TWorkWin = object (TWindow) 
 Constructor Init(Bounds: TRect); 
end;
 
type
 PInterior = ^TInterior;
 TInterior = object (TScroller)
 Location: Word;
 PS: PStringCollection;
 constructor Init(var Bounds: TRect; HS,VS: PScrollBar);
 procedure Draw; virtual;
 procedure ReadFile;
 destructor Done; virtual;
 procedure HandleEvent(var Event: TEvent); virtual; 
end;
 
type
{Объект-программа TNotebook поддерживает работу с меню и строкой статуса} 
 TNotebook = object (TApplication)  {Создаем объект-потомок от TApplication} 
 procedure InitStatusLine; virtual;  {Перекрываем старый метод InitStatusLine новым} 
 procedure InitMenuBar; virtual; 
 procedure HandleEvent(var Event: TEvent); virtual;
 procedure FileSave;
 procedure ChangeDir;
 procedure DOSCall;
 procedure FileOpen;
 procedure Work; 
end;
 
var
 HelpSystem: TNotebook;
 DataFile: file of DataType; {Файловая переменная} 
 OpFileF: Boolean; {Флаг открытого файла}
// NLines: Word; {Истинная длина массива строк} 
 
destructor TInterior.Done; 
begin
 Dispose(PS, Done); {Удаляем коллекцию} 
 inherited Done {Выполняем стандартный деструктор} 
end;
 
Procedure TInterior.HandleEvent(var Event: TEvent); 
{Обработчик событий для окна данных} 
var
 R: TPoint; 
begin
 Inherited HandleEvent(Event);
 case Event.What of
  evMouseDown: {Реакция на щелчок мышью} 
              begin
               MakeLocal(MouseWhere, R);{Получаем в R локальные координаты указателя мыши}
               Location := Delta.Y+R.Y; 
               Draw; 
              end;
 evKeyDown: {Реакция на клавиши + -} 
 case Event.KeyCode of
  kbGrayMinus: if Location > Delta.Y then 
               begin
                Dec(Location); 
                Draw; 
               end;
  kbGrayPlus: if Location < Delta.Y+pred(Size.Y) then 
              begin
               inc(Location); 
               Draw
              end; 
 end; 
 
end 
end; {TInterior.HandleEvent}
 
Procedure TInterior.ReadFile;
{Читает содержимое файла данных в массив Lines}
var
 k: Integer;
 s: String;
 Data: DataType;
 f: text;
begin
 PS := New(PStringCollection, Init(100,10)); 
 s := copy(ParamStr(0),1,pos('.',ParamStr(0)))+'pas'; 
 Assign(f,s);
 Reset (f); {Открыть файл с текстом программы} 
 while not (EOF(f) or LowMemory) do begin
  readln(f,s);
  if s <> ' ' then PS^.Insert(NewStr(s)) 
 end;
 Close(f); 
 exit;
 Seek(DataFile,0);
 while not (EOF(DataFile) or LowMemory) do 
 begin
  read(DataFile, data); 
  with data do begin
  end;
  if s<>''then PS^.Insert(NewStr(s)) 
 end;
 Location:=0;
end; {ReadFile}
 
Constructor TInterior.Init(var Bounds: TRect; HS,VS: PScrollBar); 
{Создает окно для данных}
begin
 inherited Init(Bounds, HS, VS);
 ReadFile;
 GrowMode := gfGrowHiX + gfGrowHiY;
 SetLimit(LLine, PS^.Count) 
end; {TInterior.Init}
 
Procedure TInterior.Draw; 
{Выводит данные в окно просмотра} 
var
 n,k:Integer;
 B: TDrawBuffer;
 p: PString; 
 Color: Byte; 
 
begin
 if Delta.Y > Location then
  Location := Delta.Y;
 if Location > Delta.Y+pred(Size.Y) then
  Location := Delta.Y+pred(Size.Y); 
 for n := 0 to pred(Size.Y) do begin
  k := Delta.Y+n; 
  if k=Location then
   Color := GetColor(2) 
  else
   Color := GetColor(1);
 end 
end; {TInterior.Draw}
 
constructor TWorkWin.Init(Bounds: TRect);
{Создание окна данных}
var
 HS,VS: PScrollBar; {Полосы-указатели}
 Interior: PInterior; {Указатель на управляемое текстовое окно} 
begin
 TWindow.Init(Bounds,'',0); {Создаем новое окно с рамкой}
 GetClipRect(Bounds); {Получаем в BOUNDS координаты минимальной перерисовываемой части окна}
 Bounds.Grow(-1,-1); {Устанавливаем размеры окна с текстом}
 {Включаем стандартные по размеру и положению полосы-указатели:}
 VS := StandardScrollBar(sbVertical+sbHandleKeyBoard);
 HS := StandardScrollBar(sbHorizontal+sbHandleKeyBoard); 
 {Создаем текстовое окно:}
 Interior := New(PInterior,Init(Bounds, HS, VS)); 
 Insert(Interior); {Включаем его в основное окно} 
end; {TWorkWin.Init}
 
procedure TNotebook.InitMenuBar; 
{Создание верхнего меню}
var
 R: TRect; 
begin
 GetExtent(R);
 R.B.Y := succ(R.A.Y) ; {R - координаты, строки меню} 
 MenuBar := New(PMenuBar, Init(R, NewMenu ( {Создаем меню}
 {Первый элемент нового меню представляет собой подменю (меню второго уровня) . Создаем его}
 NewSubMenu( '~F~/ File', hcNoContext, 
 {Описываем элемент главного меню} 
 NewMenu( {Создаем подменю} 
 NewItem( '~1~/ Open ', 'F3' , kbF3,cmOpen, hcNoContext, 
 NewItem( '~2~/ Close ', 'F2', kbF2, cmSave,hcNoContext, 
 NewItem( '~3~/ Change disk' , ' ' , 0, cmChangeDir,hcNoContext, 
 NewLine ( {Строка-разделитель} 
 NewItem('~4~/ Call DOS' , ' ' , 0, cmDOSShell, hcNoContext, 
 NewItem('~5~/ Exit' , 'Alt-X' , kbAltX, cmQuit, hcNoContext,
 NIL) ))))) {Нет других элементов подменю} ),
 {Создаем второй элемент главного меню} 
 NewItem( '~W~/ Work', ' ', kbF4, cmWork, hcNoContext, 
 NIL) {Нет других элементов главного меню} )))) 
end; {TNotebook. InitMenuBar}
 
procedure TNotebook.InitStatusLine; {Описание нового метода,
 с помощью которого создается строка статуса}
var
 R: TRect; {Границы строки статуса} 
begin
 GetExtent(R); {Получаем в R координаты всего экрана} 
 R.A.Y := pred(R.B.Y); {Помещаем в R координаты строки статуса}
 {Создаем строку статуса} 
 StatusLine := New(PStatusLine, Init(R, 
 {Определяем один вариант строки статуса} 
 NewStatusDef(0, $FFFF, {Устанавливаем для этого варианта
 максимальный диапазон контекстной справочной службы}
 {Определяем единственную клавишу Alt-X} 
 NewStatusKey('~Alt-X~ Exit' , kbAltX, cmQuit,
 NewStatusKey('~F2~ Close', kbF2, cmSave,
 NewStatusKey('~F3~ Open', kbF3,cmOpen,
 NewStatusKey('~F4~ Work', kbF4,cmWork, 
 NewStatusKey('~F10~ Menu', kbF10,cmMenu,
 {Нет других клавиш} NIL))))),
 {Нет других строк статуса} NIL) ));
 DisableCommands(WinCom1) {Запрещаем недоступные команды} 
end; {TNotebook. InitStatusLine}
 
procedure TNotebook.FileOpen; {Открывает файл данных} 
var
 PF: PFileDialog; {Диалоговое окно выбора файла} 
 Control: Word; 
 s: PathStr; 
begin
 {Создаем экземпляр динамического объекта} 
 New(PF, Init('*.dat','Выберите нужный файл:','Имя файла',fdOpenButton,0)); 
 {С помощью следующего оператора окно выводится на экран и результат работы пользователя с ним помещается в переменную Control}
 Control := DeskTop^.ExecView(PF); 
 {Анализируем результат запроса} 
 case Control of 
  cmFileOpen, cmOk: 
   begin {Пользователь указал имя файла}
    PF^.GetFileName(s) ; {s содержит имя файла}
    {Открыть файл}
    Assign(DataFile,s); {Отсюда начинаются новые строки}
    {$I-}
    Reset(DataFile);
//    if IOResult <> 0 then
//     Rewrite{DataFile);
    OpFileF := IOResult=0; 
//     {$I+}
    if OpFileF then begin
     DisableCommands(WinCom2);
     EnableCommands(WinCom1);
    end;
   end;
 end; {case Control} 
 Dispose (PF, Done) {Уничтожаем экземпляр} 
end; {FileOpen}
 
procedure TNotebook.FileSave;
{Закрывает файл данных} 
begin
 Close(DataFile);
 OpFileF := False;
 EnableCommands(WinCom2); {Разрешаем открыть файл}
 DisableCommands(WinCom1); {Запрещаем работу и сохранение} 
end; {TNotebook.FileSave}
 
procedure TNotebook.ChangeDir;
{Изменяет текущий каталог} 
var
 PD: PChDirDialog; {Диалоговое окно смены каталога/диска}
 Control: Word; 
 s: string;
begin
 New(PD, Init(cdNormal,0)); {Создаем диалоговое окно}
 Control := DeskTop^.ExecView(PD); {Используем окно}
 ChDir(PD^.Dirinput^.Data^); {Устанавливаем новый каталог}
 Dispose(PD, Done); {Удаляем окно из кучи}
end; {TNotebook.ChangeDir}
 
procedure TNotebook.DOSCall;
{Временный выход в ДОС} 
const
 txt ='Для возврата введите EXIT в ответ'+' на приглашение ДОС...'; 
begin
end; {DOSCall}
 
procedure TNotebook.Work;
{Работа с данными}
var
 R: TRect;
 PW: PWorkWin; 
begin
 R.Assign(0,0,80,23) ;
 PW := New(PWorkWin, Init(R));
 DeskTop^.Insert(PW) 
end; {Work}
 
procedure TNotebook.HandleEvent(var Event: TEvent); 
{Обработчик событий программы} 
begin {TNotebook.HandleEvent} 
 inherited HandleEvent(Event);{Обработка стандартных команд cmQuit и cmMenu}
 if Event.What = evCommand then 
  case Event.Command of
   {Обработка новых команд:}
   cmOpen: FileOpen; {Открыть файл}
   cmSave: FileSave; {Закрыть файл}
   cmChangeDir: ChangeDir; {Сменить диск}
   cmDOSShell: DOSCall; {Временный выход в ДОС}
   cmWork: Work; {Обработать данные} 
 else
  exit {Не обрабатывать другие команды} 
 end;
 ClearEvent (Event) {Очистить событие после обработки}
end; {TNotebook.HandleEvent}
 
begin
 HelpSystem.Init;
 HelpSystem.Run;
 HelpSystem.Done;
end.
Добавлено через 22 минуты
Программа падает при обращении к процедуре TNotebook.Work

Pascal
1
2
3
4
5
6
7
8
9
10
procedure TNotebook.Work;
{Работа с данными}
var
 R: TRect;
 PW: PWorkWin; 
begin
 R.Assign(0,0,80,23) ;
 PW := New(PWorkWin, Init(R));
 DeskTop^.Insert(PW) 
end; {Work}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.09.2012, 20:32 17
Что надо открыть? В каком формате данные в файле?
0
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
23.09.2012, 20:38  [ТС] 18
Цитата Сообщение от UI Посмотреть сообщение
Что надо открыть? В каком формате данные в файле?
Открываю пустой файл t.dat
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.09.2012, 20:45 19
Ну, понятно, у меня вылетало потому, что ты в TInterior.ReadFile создаешь имя файла с расширением PAS:
Pascal
1
 s := copy(ParamStr(0),1,pos('.',ParamStr(0)))+'pas';
, а у меня его просто нет, у меня PP используется для FPC-шных файлов. Кстати, если в том же методе, в строке 112 твоего кода, заменить пробел на пустую строку, то ничего не вылетает. Правда, окно отображается не так, как следовало бы, но это ты уж расскажи, что именно тебе надо сделать, чтоб можно было советовать, как поправить.
0
3 / 3 / 0
Регистрация: 19.09.2012
Сообщений: 146
23.09.2012, 21:30  [ТС] 20
Цитата Сообщение от UI Посмотреть сообщение
Кстати, если в том же методе, в строке 112 твоего кода, заменить пробел на пустую строку, то ничего не вылетает. Правда, окно отображается не так, как следовало бы, но это ты уж расскажи, что именно тебе надо сделать, чтоб можно было советовать, как поправить.
Мне нужно сделать какое-то подобие таблицы. Далее я планировал создать диалоговое окно для ввода данных

Добавлено через 22 минуты
Как бы сделать фон синим?
0
23.09.2012, 21:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2012, 21:30
Помогаю со студенческими работами здесь

3D VISION BY NVIDIA
Видеокарта PCI-E 2.0 MSI N580GTX-Twin Frozr ll, 1.5Гб, GDDR5, Ret Видеокарта PCI-E 2.0 MSI...

NVIDIA 3D VISION
Не могу понять, вроде как пишут, что очки 3D VISION 2 от NVIDIA сняли с продажи и в Российских...

Монитор для 3D vision
Посоветуйте пожалуйста монитор для nvidia 3D Vision. И один вопрос. Nvidia 3D Vision будет...

Глючит NVIDIA 3d VISION
Давно стоит NVIDIA 3d vision, но таких проблем не было никогда. После переустановки системы,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru