привет, мы используем версию Delphi 5. Возникла проблема при открытии блокнота в delphi. Мы хотим открыть блокнот нажатием кнопки и передать ему данные, чтобы блокнот мог отображать эти данные. Я не хочу экономить. пожалуйста, помогите мне в этом. благодаря.
Проблема с блокнотом в делфи
Ответы (4)
Вы можете использовать что-то вроде:
uses
Clipbrd;
procedure LaunchNotepad(const Text: string);
var
SInfo: TStartupInfo;
PInfo: TProcessInformation;
Notepad: HWND;
NoteEdit: HWND;
ThreadInfo: TGUIThreadInfo;
begin
ZeroMemory(@SInfo, SizeOf(SInfo));
SInfo.cb := SizeOf(SInfo);
ZeroMemory(@PInfo, SizeOf(PInfo));
CreateProcess(nil, PChar('Notepad'), nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo);
WaitForInputIdle(pInfo.hProcess, 5000);
Notepad := FindWindow('Notepad', nil);
// or be a little more strict about the instance found
// Notepad := FindWindow('Notepad', 'Untitled - Notepad');
if Bool(Notepad) then begin
NoteEdit := FindWindowEx(Notepad, 0, 'Edit', nil);
if Bool(NoteEdit) then begin
SendMessage(NoteEdit, WM_SETTEXT, 0, Longint(Text));
// To force user is to be asked if changes should be saved
// when closing the instance
SendMessage(NoteEdit, EM_SETMODIFY, WPARAM(True), 0);
end;
end
else
begin
ZeroMemory(@ThreadInfo, SizeOf(ThreadInfo));
ThreadInfo.cbSize := SizeOf(ThreadInfo);
if GetGUIThreadInfo(0, ThreadInfo) then begin
NoteEdit := ThreadInfo.hwndFocus;
if Bool(NoteEdit) then begin
Clipboard.AsText := Text;
SendMessage(NoteEdit, WM_PASTE, 0, 0);
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
LaunchNotepad('test string');
end;
end else begin
. ;)
- person NGLN; 12.07.2011
SendMessageA
, или могу отправить искаженный текст, отправив строку ansi с помощью SendMessageW
. Я могу установить тексты Notepad (unicode), ConTEXT (ansi) с помощью SendMessageA или SendMessageW, если я использую соответствующий тип строки.
- person Sertac Akyuz; 12.07.2011
Вы можете использовать следующую команду в событии нажатия кнопки. Укажите имя файла, который вы хотите открыть в textFileName.txt
ShellExecute(Handle,'open', 'c:\windows\notepad.exe','textFileName.txt', nil, SW_SHOWNORMAL) ;
Если вы хотите открыть пустой текстовый файл и не хотите сохранять какие-либо данные, вы можете использовать следующий метод для события клика. ShellExecute(Handle,'open', 'c:\windows\notepad.exe',nil, nil, SW_SHOWNORMAL) ;
Добавьте также ShellApi
в класс использования.
Обновленный код
procedure TForm1.Button1Click(Sender: TObject);
var
tempString : TStringList;
begin
tempString := TStringList.Create;
try
tempString.Add('The text you wanted to display');
tempString.SaveToFile('C:\~tempFile.txt');
finally
tempString.Free;
end;
ShellExecute(Handle,'open', 'c:\windows\notepad.exe','C:\~tempFile.txt', nil, SW_SHOWNORMAL) ;
end;
Если вы не хотите, чтобы они могли сохранять данные, было бы более разумно сделать свой собственный Блокнот похожим, в конце концов, для этого хорош TMemo, а затем разрешить им редактировать только текст - если это ваше требование. В противном случае мало что помешает им сохранить файл.
Блокнот в Delphi.
Возьмите один
TMemo
и дайте имя как: (memNotepad)Возьмите один
TrzOpenDialog
(rzopdlgOpenDialog)- Возьмите один
TrzSaveDialog
(rzsvdlgSaveDialog) - Возьмите один
FontDialog
(ftdlgFontDialog) - Take one
TMainMenu
(mmMainMenu)- add the menu items File : New,Open,Save,SaveAs,Exit, Edit : Cut,Copy,Paste,Font
Код:
********************************************************************
unit ufrmNotePad;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, RzShellDialogs, cxGraphics, cxCustomData,
cxStyles, cxTL, cxControls, cxInplaceContainer, IniFiles;
type
TfrmNotepad = class(TForm)
memNotePad: TMemo;
rzopdlgOpenDialog: TRzOpenDialog;
rzsvdlgSaveDialog: TRzSaveDialog;
mmMainMenu: TMainMenu;
mniFile: TMenuItem;
mniSave: TMenuItem;
mniOpen: TMenuItem;
mniNew: TMenuItem;
mniSaveAs: TMenuItem;
mniEdit: TMenuItem;
mniPaste: TMenuItem;
mniCopy: TMenuItem;
mniCut: TMenuItem;
ftdlgFontDialog: TFontDialog;
mniFont: TMenuItem;
mniExit: TMenuItem;
procedure mniOpenClick(Sender: TObject);
procedure mniSaveClick(Sender: TObject);
procedure mniNewClick(Sender: TObject);
procedure mniSaveAsClick(Sender: TObject);
procedure mniCopyClick(Sender: TObject);
procedure mniPasteClick(Sender: TObject);
procedure mniCutClick(Sender: TObject);
procedure mniFontClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure mniEditClick(Sender: TObject);
procedure mniExitClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
procedure OpenDialog;
procedure SaveDialog;
procedure NewNotepad;
procedure SaveAS;
procedure Copy;
procedure Cut;
procedure Paste;
procedure Font;
procedure SaveSettingInToFile;
procedure RetrieveSettingFromTheFile;
public
{ Public declarations }
FIniFile : TIniFile;
FFileName : String;
FCount : Integer;
end;
var
frmNotepad : TfrmNotepad;
implementation
{$R *.dfm}
{ Open File from the disk }
{ FCount- helps for save the file, if file is already save then FCount := 1 else FCount := 0}
{ FFileName - helps for store the filename of open filename or saved filename }
procedure TfrmNotepad.OpenDialog;
begin
FCount := 1;
rzopdlgOpenDialog.Title := 'Open File';
rzopdlgOpenDialog.Filter := 'Text Files|*.txt; RTF Files|*.rtf';
if rzsvdlgSaveDialog.FileName = FFileName then
begin
if rzopdlgOpenDialog.Execute then
memNotePad.Lines.LoadFromFile(rzopdlgOpenDialog.FileName);
end
{ if any file already opened and without saving the file try to open new file
then message dialog box appears on the screen for save the file or save modification of the file }
else if (memNotePad.Modified) then
begin
ModalResult := MessageDlg('Do you want to save Changes to untitled?',mtConfirmation,mbYesNoCancel,0);
if (ModalResult = mrYes) then
begin
if rzsvdlgSaveDialog.Execute then
memNotepad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName + '.txt');
memNotePad.Clear;
memNotePad.Modified := False;
end
else if (ModalResult = mrNo) then
begin
if rzopdlgOpenDialog.Execute then
begin
memNotePad.Lines.LoadFromFile(rzopdlgOpenDialog.FileName);
FFileName := rzopdlgOpenDialog.FileName;
end;
end;
end
else if rzopdlgOpenDialog.Execute then
begin
memNotePad.Lines.LoadFromFile(rzopdlgOpenDialog.FileName);
FFileName := rzopdlgOpenDialog.FileName;
end;
Caption := rzopdlgOpenDialog.FileName + ' - Delphi Notepad';
end;
{ Saving the file }
procedure TfrmNotepad.SaveDialog;
begin
rzsvdlgSaveDialog.Title := 'Save';
rzsvdlgSaveDialog.Filter := 'Text Files|*.txt; RTF Files|*.rtf';
{ if file already exist and after modification we try to save then it directly save into the file without opening the save dialog box }
if FCount = 1 then
begin
{ filename store in the FFileName is compare with the save dialog box filename
if it matches then modification dirctly save into that file without opening the save dialog box }
if rzsvdlgSaveDialog.FileName = FFileName then
memNotePad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName + '.txt')
{ filename store in the FFileName is compare with the open dialog box filename
if it matches then modification dirctly save into that file without opening the save dialog box }
else if rzopdlgOpenDialog.FileName = FFileName then
begin
rzsvdlgSaveDialog.FileName := rzopdlgOpenDialog.FileName;
memNotePad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName);
end;
end
{ else file already not save then Save Dialog box open }
else
begin
if rzsvdlgSaveDialog.Execute then
memNotePad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName + '.txt');
Caption := rzsvdlgSaveDialog.FileName + ' - Delphi Notepad';
FCount := 1;
end;
FFileName := rzsvdlgSaveDialog.FileName;
end;
{ New Notepad }
procedure TfrmNotepad.NewNotepad;
begin
if FCount = 1 then
begin
memNotePad.Clear;
Caption := 'UnNamed Delphi Notepad';
end
else if not (memNotePad.Modified) then
begin
memNotePad.Clear;
Caption := 'UnNamed Delphi Notepad';
end
{ without saving the modification's of file if try to click on new then
message dialog box appears on the screen for saving the modification's }
else if (memNotePad.Modified) then
begin
ModalResult := MessageDlg('Do you want to save Changes',mtConfirmation,mbYesNoCancel,0);
if (ModalResult = mrYes) then
begin
if rzsvdlgSaveDialog.Execute then
memNotepad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName + '.txt');
memNotePad.Clear;
memNotePad.Modified := False;
end
else if (ModalResult = mrNo) then
begin
memNotePad.Clear;
memNotePad.Modified := False;
end;
end;
FFileName := rzsvdlgSaveDialog.FileName;
FCount := 1;
end;
{ Save As }
procedure TfrmNotepad.SaveAS;
begin
rzsvdlgSaveDialog.Title := 'Save As';
rzsvdlgSaveDialog.Filter := 'Text Files|*.txt; RTF Files|*.rtf';
if rzsvdlgSaveDialog.Execute then
memNotepad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName + '.txt');
memNotePad.Clear;
memNotePad.Modified := False;
end;
{ Cut text }
procedure TfrmNotepad.Cut;
begin
memNotePad.CutToClipboard;
end;
{ Copy text }
procedure TfrmNotepad.Copy;
begin
memNotePad.CopyToClipboard;
end;
{ Paste }
procedure TfrmNotepad.Paste;
begin
memNotePad.PasteFromClipboard;
end;
{ Font Dialog is assign to memo }
procedure TfrmNotepad.Font;
begin
if ftdlgFontDialog.Execute then
memNotePad.Font := ftdlgFontDialog.Font;
end;
{ Save the setting of font in to Ini file }
procedure TfrmNotepad.SaveSettingInToFile;
var
LColorName : String;
begin
FIniFile.WriteString('Setting', 'FontName', memNotePad.Font.Name);
FIniFile.WriteString('Setting', 'FontSize', IntToStr(memNotePad.Font.Size));
LColorName := ColorToString(memNotePad.Font.Color);
FIniFile.WriteString('Setting', 'FontColor', LColorName);
end;
{ Retrieve the setting of font from Ini file }
procedure TfrmNotepad.RetrieveSettingFromTheFile;
var
LFontName, LFontSize, LFontColor: String;
begin
FIniFile := TIniFile.Create('FontSettings.ini');
LFontName := FIniFile.ReadString('Setting', 'FontName', 'Arial');
memNotePad.Font.Name := LFontName;
LFontSize := FIniFile.ReadString('Setting', 'FontSize', '8');
memNotePad.Font.Size := StrToInt(LFontSize);
LFontColor := FIniFile.ReadString('Setting', 'FontColor',
ColorToString(clBlack));
memNotePad.Font.Color := StringToColor(LFonTColor);
ftdlgFontDialog.Font := memNotePad.Font;
end;
procedure TfrmNotepad.mniOpenClick(Sender: TObject);
begin
OpenDialog;
end;
procedure TfrmNotepad.mniSaveClick(Sender: TObject);
begin
SaveDialog;
end;
procedure TfrmNotepad.mniNewClick(Sender: TObject);
begin
NewNotepad;
end;
procedure TfrmNotepad.mniSaveAsClick(Sender: TObject);
begin
SaveAS;
end;
{ Exit from Notepad }
procedure TfrmNotepad.mniExitClick(Sender: TObject);
begin
{ While exit if the modification in file is not save then then message dialog appear on the screen }
if (memNotePad.Modified) then
begin
ModalResult := MessageDlg('Do you want to save
Changes',mtConfirmation,mbYesNoCancel,0);
if (ModalResult = mrYes) then
begin
if rzsvdlgSaveDialog.FileName = FFileName then
memNotePad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName + '.txt')
else if rzopdlgOpenDialog.FileName = FFileName then
begin
rzsvdlgSaveDialog.FileName := rzopdlgOpenDialog.FileName;
memNotePad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName);
end
else if rzsvdlgSaveDialog.Execute then
memNotepad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName + '.txt');
memNotePad.Clear;
memNotePad.Modified := False;
Close;
end
else if (ModalResult = mrNo) then
begin
memNotePad.Clear;
memNotePad.Modified := False;
Close;
end;
end;
{ call method for saving the font setting into Ini file }
SaveSettingInToFile;
end;
procedure TfrmNotepad.mniCutClick(Sender: TObject);
begin
Cut;
end;
procedure TfrmNotepad.mniCopyClick(Sender: TObject);
begin
Copy;
end;
procedure TfrmNotepad.mniPasteClick(Sender: TObject);
begin
Paste;
end;
procedure TfrmNotepad.mniFontClick(Sender: TObject);
begin
Font;
end;
procedure TfrmNotepad.FormCreate(Sender: TObject);
begin
FCount := 0;
FFileName := 'ok';
{ call method for retrieve the font setting from Ini file }
RetrieveSettingFromTheFile;
end;
procedure TfrmNotepad.FormDestroy(Sender: TObject);
begin
{ call method for saving the font setting into Ini file }
SaveSettingInToFile;
end;
{ when text is selected on notepad, only then the copy & cut are enabled else disabled }
procedure TfrmNotepad.mniEditClick(Sender: TObject);
begin
mniCopy.Enabled := memNotePad.SelLength > 0;
mniCut.Enabled := memNotePad.SelLength > 0;
end;
procedure TfrmNotepad.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
{ While Destroying the form if the modification in file is not save then then
message dialog appear on the screen }
rzsvdlgSaveDialog.Filter := 'Text Files|*.txt; RTF Files|*.rtf';
if (memNotePad.Modified) then
begin
ModalResult := MessageDlg('Do you want to save
Changes',mtConfirmation,mbYesNoCancel,0);
if (ModalResult = mrYes) then
begin
if rzsvdlgSaveDialog.FileName = FFileName then
memNotePad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName + '.txt')
else if rzopdlgOpenDialog.FileName = FFileName then
begin
rzsvdlgSaveDialog.FileName := rzopdlgOpenDialog.FileName;
memNotePad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName);
end
else if rzsvdlgSaveDialog.Execute then
memNotepad.Lines.SaveToFile(rzsvdlgSaveDialog.FileName + '.txt');
memNotePad.Clear;
memNotePad.Modified := False;
end
else if (ModalResult = mrNo) then
begin
memNotePad.Clear;
memNotePad.Modified := False;
end;
end;
CanClose := True;
end;
end.