Ĺadny brzuch
1 Wstęp
Celem zadania 2 jest przećwiczenie zastosowania podstawowych komponentów Delphi (przyciski, pola tekstowe, suwaki, menu, grid’y, okienka komunikatów, itp.), wykorzystania własności komponentów oraz określania reakcji na zdarzenia.
2 Działanie programu
Program powinien umożliwiać otworzenie dowolnego pliku dyskowego (niekoniecznie tekstowego!), przeprowadzenie jego edycji i zapisanie wprowadzonych zmian. Program musi zawierać:
• Menu ze standardowymi opcjami "Otwórz", "Zapisz", "Zapisz jako", "Koniec".
• Okienko wyświetlające zawartość kolejnych bajtów pliku w postaci liczb szesnastkowych.
• Okienko wyświetlające zawartość kolejnych bajtów pliku w postaci znaków, o ile znak odpowiadający danemu bajtowi jest możliwy do wyświetlenia.
• Oba powyższe okienka muszą zawsze wyświetlać ten sam fragment pliku.
• Oba powyższe okienka muszą umożliwiać zmianę oglądanego fragmentu pliku przy pomocy suwaków.
• Oba powyższe okienka muszą umożliwiać zmianę wartości dowolnego wyświetlonego w nich bajtu z pliku.
3 Uwagi
• W sytuacjach gdy konieczne jest wprowadzenie nazwy pliku program NIE musi wyświetlać zawartości katalogu i umożliwiać wyboru z listy (tzn. nie musi być opcji "przeglądaj").
• Można przyjąć ograniczenie maksymalnej wielkości pliku możliwego do edycji powyższym programem. Wielkość tego ograniczenia nie może być mniejsza niż 1KB.
Z pogrubionymi rzeczami mam największy problem. Pomysł na sam algorytm do nich mam ale nie wiem czym odwołać się do nich. Wykorzystuje dwa drawgridy w celu wyświetlenia poszczególnyhc bajtów. Zaznaczanie tego samego fragmentu pliku mam. Problem zaczyna się przy:
1. scrollbarach (oba powinny jednoczesnie przesuwać się).
2.korzystaniu z takiego eventu drawgrida jak "OnGetEditText". Wiem, że to teoretycznie powinienem użyć kiedy chce zmienić wartość danej komórki na inną (czy to w HEX czy ASCII), oraz powiązaniu tego zeby automatycznie uwzględniał zmiany na drugim drawgridze.
3. Przydałaby się jakaś wskazówka jak korzystająć z komponentu MENU przypisać zdarzanie "zapisz" itd. Jak bawiłem się przy memo to w sumie nie bylo problemu z tym, ale nie wiem jak to przerobić, żeby otwierał w gridach.
Przy memo miałem coś takiego: procedure TMainForm.FileOpenClick(Sender: TObject); var Res : Integer; begin if Memo.Modified then begin Res := Application.MessageBox( 'The current file has changed. Save changes?', 'ScratchPad Message', MB_YESNOCANCEL); if Res = IDYES then FileSaveClick(Sender); if Res = IDCANCEL then Exit; end; OpenDialog.FileName := ''; if OpenDialog.Execute then begin if Memo.Lines.Count > 0 then Memo.Clear; Memo.Lines.LoadFromFile(OpenDialog.FileName); SaveDialog.FileName := OpenDialog.FileName; end; end; procedure TMainForm.FileSaveClick(Sender: TObject); begin if SaveDialog.FileName <> '' then begin Memo.Lines.SaveToFile(SaveDialog.FileName); Memo.Modified := False; end else FileSaveAsClick(Sender); end; procedure TMainForm.FileNewClick(Sender: TObject); var Res : Integer; begin if Memo.Modified then begin Res := Application.MessageBox( 'The current file has changed. Save changes?', 'ScratchPad Message', MB_YESNOCANCEL); if Res = IDYES then FileSaveClick(Sender); if Res = IDCANCEL then Exit; end; if Memo.Lines.Count > 0 then Memo.Clear; SaveDialog.FileName := ''; end; procedure TMainForm.FileSaveAsClick(Sender: TObject); begin SaveDialog.Title := 'Save As'; if SaveDialog.Execute then begin Memo.Lines.SaveToFile(SaveDialog.FileName); Memo.Modified := False; end; end;Na co powinienem zamienic te wszystkie memo.XXXX.XXX żeby działało mi to z dragridami?
Wrazie czego wklejam kod samego programu, żeby ułątwić pomoc: unit zad2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ToolWin, ComCtrls, Menus, Grids; type TForm1 = class(TForm) StatusBar: TStatusBar; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; OpenDialog: TOpenDialog; SaveDialog: TSaveDialog; DrawGrid1: TDrawGrid; DrawGrid2: TDrawGrid; procedure FormDestroy(Sender: TObject); procedure DrawGrid1TopLeftChanged(Sender: TObject); procedure DrawGrid2TopLeftChanged(Sender: TObject); procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure DrawGrid2DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure ToolButton1Click(Sender: TObject); procedure DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure DrawGrid2SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure DrawGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); procedure DrawGrid1GetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String); private procedure LoadFile(const aFileName: string); procedure FreeFileStream; { Private declarations } public FileStream: TFileStream; Buffer: array[0..32000] of Byte; BufferCount: Integer; { Public declarations } end; var Form1: TForm1; liPos: Integer; lsText: string; ACol, ARow: integer; implementation {$R *.dfm} procedure TForm1.FreeFileStream; begin if Assigned(FileStream) then FreeAndNil(FileStream); end; procedure TForm1.LoadFile(const aFileName: string); begin FreeFileStream; FileStream := TFileStream.Create(aFileName, fmOpenRead); DrawGrid1.RowCount := FileStream.Size div 16; DrawGrid1TopLeftChanged(nil); DrawGrid1.Invalidate; DrawGrid2.RowCount := FileStream.Size; DrawGrid2TopLeftChanged(nil); DrawGrid2.Invalidate; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeFileStream; end; procedure TForm1.DrawGrid1TopLeftChanged(Sender: TObject); //to samo użyłem przy drugim drawgridzie begin if Assigned(FileStream) then begin FileStream.Position := DrawGrid1.TopRow * 16; BufferCount := FileStream.Read(Buffer, 32000); end; end; procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Assigned(FileStream) then begin lsText := ''; if ARow > -1 then begin liPos := (ARow - DrawGrid1.TopRow)*16 + ACol; if liPos < BufferCount then lsText := IntToHex(Buffer[liPos], 2); end else lsText := '(' + IntToStr(ACol) + ')'; DrawGrid1.Canvas.TextOut(Rect.Left, Rect.Top, lsText); end; end; procedure TForm1.DrawGrid2DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Assigned(FileStream) then begin lsText := ''; if ARow > -1 then begin liPos := (ARow - DrawGrid2.TopRow)*16 + ACol; if liPos < BufferCount then lsText := Char(Buffer[liPos]); end else lsText := '(' + IntToStr(ACol) + ')'; DrawGrid2.Canvas.TextOut(Rect.Left, Rect.Top, lsText); end end; procedure TForm1.ToolButton1Click(Sender: TObject); begin if OpenDialog.Execute then begin LoadFile(OpenDialog.FileName); end; end; procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); //w drawgrid2 zmiany tylko odniesienia var myRect: TGridRect; begin myRect.Left := ACol; myRect.Top := ARow; myRect.Right := ACol; myRect.Bottom := ARow; DrawGrid2.Selection := myRect; end;
Tak jak w poprzednim poście proszę o nie robienie złudzeń co do pomocy. Mam nadzieje, że zrozumiecie chociaż wy. Żeby nie bylo jak na innym forum, informuje, że nie wymagam napisania wszystkiego do końca za mnie tylko pomoc w skończeniu go (ale pomoc w postaci gotowego fragmentu kodu również mile widziana :) ). Te sesje mnie wykończą, a materiału na nastepny zjazd od groma. Z programem (jednym i drugim)męcze się już coś ok. miesiąca.
napisz do mnie na gg 1531972
tutaj to będzie za dużo pisania kodu ;)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Celem zadania 2 jest przećwiczenie zastosowania podstawowych komponentów Delphi (przyciski, pola tekstowe, suwaki, menu, grid’y, okienka komunikatów, itp.), wykorzystania własności komponentów oraz określania reakcji na zdarzenia.
2 Działanie programu
Program powinien umożliwiać otworzenie dowolnego pliku dyskowego (niekoniecznie tekstowego!), przeprowadzenie jego edycji i zapisanie wprowadzonych zmian. Program musi zawierać:
• Menu ze standardowymi opcjami "Otwórz", "Zapisz", "Zapisz jako", "Koniec".
• Okienko wyświetlające zawartość kolejnych bajtów pliku w postaci liczb szesnastkowych.
• Okienko wyświetlające zawartość kolejnych bajtów pliku w postaci znaków, o ile znak odpowiadający danemu bajtowi jest możliwy do wyświetlenia.
• Oba powyższe okienka muszą zawsze wyświetlać ten sam fragment pliku.
• Oba powyższe okienka muszą umożliwiać zmianę oglądanego fragmentu pliku przy pomocy suwaków.
• Oba powyższe okienka muszą umożliwiać zmianę wartości dowolnego wyświetlonego w nich bajtu z pliku.
3 Uwagi
• W sytuacjach gdy konieczne jest wprowadzenie nazwy pliku program NIE musi wyświetlać zawartości katalogu i umożliwiać wyboru z listy (tzn. nie musi być opcji "przeglądaj").
• Można przyjąć ograniczenie maksymalnej wielkości pliku możliwego do edycji powyższym programem. Wielkość tego ograniczenia nie może być mniejsza niż 1KB.
Z pogrubionymi rzeczami mam największy problem. Pomysł na sam algorytm do nich mam ale nie wiem czym odwołać się do nich. Wykorzystuje dwa drawgridy w celu wyświetlenia poszczególnyhc bajtów. Zaznaczanie tego samego fragmentu pliku mam. Problem zaczyna się przy:
1. scrollbarach (oba powinny jednoczesnie przesuwać się).
2.korzystaniu z takiego eventu drawgrida jak "OnGetEditText". Wiem, że to teoretycznie powinienem użyć kiedy chce zmienić wartość danej komórki na inną (czy to w HEX czy ASCII), oraz powiązaniu tego zeby automatycznie uwzględniał zmiany na drugim drawgridze.
3. Przydałaby się jakaś wskazówka jak korzystająć z komponentu MENU przypisać zdarzanie "zapisz" itd. Jak bawiłem się przy memo to w sumie nie bylo problemu z tym, ale nie wiem jak to przerobić, żeby otwierał w gridach.
Przy memo miałem coś takiego: procedure TMainForm.FileOpenClick(Sender: TObject); var Res : Integer; begin if Memo.Modified then begin Res := Application.MessageBox( 'The current file has changed. Save changes?', 'ScratchPad Message', MB_YESNOCANCEL); if Res = IDYES then FileSaveClick(Sender); if Res = IDCANCEL then Exit; end; OpenDialog.FileName := ''; if OpenDialog.Execute then begin if Memo.Lines.Count > 0 then Memo.Clear; Memo.Lines.LoadFromFile(OpenDialog.FileName); SaveDialog.FileName := OpenDialog.FileName; end; end; procedure TMainForm.FileSaveClick(Sender: TObject); begin if SaveDialog.FileName <> '' then begin Memo.Lines.SaveToFile(SaveDialog.FileName); Memo.Modified := False; end else FileSaveAsClick(Sender); end; procedure TMainForm.FileNewClick(Sender: TObject); var Res : Integer; begin if Memo.Modified then begin Res := Application.MessageBox( 'The current file has changed. Save changes?', 'ScratchPad Message', MB_YESNOCANCEL); if Res = IDYES then FileSaveClick(Sender); if Res = IDCANCEL then Exit; end; if Memo.Lines.Count > 0 then Memo.Clear; SaveDialog.FileName := ''; end; procedure TMainForm.FileSaveAsClick(Sender: TObject); begin SaveDialog.Title := 'Save As'; if SaveDialog.Execute then begin Memo.Lines.SaveToFile(SaveDialog.FileName); Memo.Modified := False; end; end;Na co powinienem zamienic te wszystkie memo.XXXX.XXX żeby działało mi to z dragridami?
Wrazie czego wklejam kod samego programu, żeby ułątwić pomoc: unit zad2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ToolWin, ComCtrls, Menus, Grids; type TForm1 = class(TForm) StatusBar: TStatusBar; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; OpenDialog: TOpenDialog; SaveDialog: TSaveDialog; DrawGrid1: TDrawGrid; DrawGrid2: TDrawGrid; procedure FormDestroy(Sender: TObject); procedure DrawGrid1TopLeftChanged(Sender: TObject); procedure DrawGrid2TopLeftChanged(Sender: TObject); procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure DrawGrid2DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure ToolButton1Click(Sender: TObject); procedure DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure DrawGrid2SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure DrawGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); procedure DrawGrid1GetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String); private procedure LoadFile(const aFileName: string); procedure FreeFileStream; { Private declarations } public FileStream: TFileStream; Buffer: array[0..32000] of Byte; BufferCount: Integer; { Public declarations } end; var Form1: TForm1; liPos: Integer; lsText: string; ACol, ARow: integer; implementation {$R *.dfm} procedure TForm1.FreeFileStream; begin if Assigned(FileStream) then FreeAndNil(FileStream); end; procedure TForm1.LoadFile(const aFileName: string); begin FreeFileStream; FileStream := TFileStream.Create(aFileName, fmOpenRead); DrawGrid1.RowCount := FileStream.Size div 16; DrawGrid1TopLeftChanged(nil); DrawGrid1.Invalidate; DrawGrid2.RowCount := FileStream.Size; DrawGrid2TopLeftChanged(nil); DrawGrid2.Invalidate; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeFileStream; end; procedure TForm1.DrawGrid1TopLeftChanged(Sender: TObject); //to samo użyłem przy drugim drawgridzie begin if Assigned(FileStream) then begin FileStream.Position := DrawGrid1.TopRow * 16; BufferCount := FileStream.Read(Buffer, 32000); end; end; procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Assigned(FileStream) then begin lsText := ''; if ARow > -1 then begin liPos := (ARow - DrawGrid1.TopRow)*16 + ACol; if liPos < BufferCount then lsText := IntToHex(Buffer[liPos], 2); end else lsText := '(' + IntToStr(ACol) + ')'; DrawGrid1.Canvas.TextOut(Rect.Left, Rect.Top, lsText); end; end; procedure TForm1.DrawGrid2DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Assigned(FileStream) then begin lsText := ''; if ARow > -1 then begin liPos := (ARow - DrawGrid2.TopRow)*16 + ACol; if liPos < BufferCount then lsText := Char(Buffer[liPos]); end else lsText := '(' + IntToStr(ACol) + ')'; DrawGrid2.Canvas.TextOut(Rect.Left, Rect.Top, lsText); end end; procedure TForm1.ToolButton1Click(Sender: TObject); begin if OpenDialog.Execute then begin LoadFile(OpenDialog.FileName); end; end; procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); //w drawgrid2 zmiany tylko odniesienia var myRect: TGridRect; begin myRect.Left := ACol; myRect.Top := ARow; myRect.Right := ACol; myRect.Bottom := ARow; DrawGrid2.Selection := myRect; end;
Tak jak w poprzednim poście proszę o nie robienie złudzeń co do pomocy. Mam nadzieje, że zrozumiecie chociaż wy. Żeby nie bylo jak na innym forum, informuje, że nie wymagam napisania wszystkiego do końca za mnie tylko pomoc w skończeniu go (ale pomoc w postaci gotowego fragmentu kodu również mile widziana :) ). Te sesje mnie wykończą, a materiału na nastepny zjazd od groma. Z programem (jednym i drugim)męcze się już coś ok. miesiąca.
napisz do mnie na gg 1531972
tutaj to będzie za dużo pisania kodu ;)