くだすれDelphi(超初心者用)その57 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、もしくは
質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
■Delphi XE6 Professional/Enterprise/Ultimate/Architect エディション(トライアル版有)
64bit Windows、Mac OS XからiOS、Androidのアプリも開発可能。ライブラリのソースコード付き。アカデミックライセンス有り。
旧バージョン(XE6/5/4/3/2/XE/2010/2009/2007/Delphi 7)のライセンス取得とダウンロードが可能。(アカデミック不可)
ttp://www.embarcadero.com/jp/products/delphi
■Delphi XE6 Starter エディション
個人/5人以下の企業・組織向け。年間売上1000US$以内の商用開発可。
(※)Delphi、Visual Studio等の有償/無償の開発ツールユーザーが対象。インストール確認は特に行わない。
ttp://www.embarcadero.com/jp/products/delphi/starter
■Embarcadero RAD Studio XE6 (Delphi、C++Builder、HTML5 Builder等を含むビジュアル開発スイート)
ttp://www.embarcadero.com/jp/products/rad-studio
<前スレ>
くだすれDelphi(超初心者用)その56
http://echo.2ch.net/test/read.cgi/tech/1405783063/
<過去スレ>
DelWiki (Delphi 関連の過去スレッド)※行方不明
ttp://delwiki.info/? >>683
良くサイトを見たら、体験版の承認キーの発行は終了しているみたいです。
せっかく教えていただいたのにすみません。 FMXをタッチパネルついてるWindows10で動作させるとTListViewとかが勝手にタッチパネル用のスタイルになるのどうにかならんかなぁ
Scrollbarが表示されない上にタッチパネル操作になるから操作が統一できない・・・
デバイス自体を無効にしたらタッチパネルじゃないスタイルで動作するけどなんだかなー ListBoxの項目にFocusを付与したいのですが、3,4日うまくいかず困っています。
クリック以外の方法でListBoxにFocusを付与する方法というのはありますか? ListBox1.ItemIndex:=3;
ListBox1.SetFocus;
ってこと?
なんか以前にもこんな質問あったような気がするが >>687
どうもです。
ただ、マウスクリックするとFocusが出ますが、ListBoxの他の所をクリックすると消えちゃうんですよね…。 >>688
そりゃそうだ
他のフォーカスを持つ所をクリックすればフォーカス移る
何がしたいのかわからない
「ウィンドウ ハンドルを持つコンポーネント」の意味を理解してますか?
例えばここ http://delfusa.main.jp/delfusafloor/archive/VA009712_take/delphi/kabeapp.htm
ListBox以外にフォーカス動かしたくないんなら
他の全てをフォーカスを持たないSpeedButtonとかメニューやツールバーとかにするしかない
或いは他を Enabled:=Falseにするとか こんな物を作っていました。
ttp://www1.axfc.net/u/3946835.zip?key=123456
既知の不具合
下手にいじると簡単にバックグラウンドプロセスに行ってしまう。
Focusについてですが、このアプリはFocusが残る物をベースに作りました。
新しく作り直した物がListboxをクリックすると一瞬だけFocusが表示されるのですが
すぐ消えてしまうと言うよく分からない現象が起きていました。
よろしかったらご評価いただければ幸いです。
もう我流は辞めてTurboDelphi〜を参考書に勉強したいと思います。 大事なことを忘れていました。
このアプリはエクスプローラ上で.wavファイルを選択し「送る」もしくはアイコンでD&Dすると再生を始めます。
またアプリを起動して、エクスプローラからフォームに直接D&Dすると曲を演奏します。
よろしくお願いいたします。 そうですよ。まだやってました。石の上にも3年と言う言葉もありますし
おかげさまで、プログラミング技法の第一巻の半分くらいまでは理解できるようになりました。
今度はちゃんと基礎からやり直したいと思います。
あげたファイルはアルファー版ほどの出来ですが、今の知識で作った物です。
ご興味がありましたら、ご評価をよろしくお願いいたします。 >>685
確かにスクロールバーが通常は非表示だけど
そんなに違いがあったっけ?
自分としてはマウスホイールでスクロールしてるときも
スクロールバーが非表示なのがあれだけど >>694
マウスでドラッグしたらスクロールできたり(タッチパネル式だからマウスでスクロールバー操作するのとは逆の動きする)、スクロールバーが表示されてるときにクリックしても反応なかったり
OS側で常にスクロールバー表示しても非表示とか
レガシーな入力デバイスが主なプラットホームでは切り替えられるようにしといて欲しい・・・ >>695
てかいま自分が作ってるfmxアプリをwindowsタブレットで動かしてみると
listviewとかのタッチでのスクロールには少し違和感があるね
android上とは明らかに違う操作感だ >>690
ごめん俺687と689を書いた者だけど自分の勉強以外で人のソース読むほど時間はないんだ
と書きながらも流し読みだけでもしようかと開いてみたら
「404 Not Foundファイルが見つかりません」
>新しく作り直した
と書かれているがそれは今までのソースのつぎはぎコピペではなく自分で理解しながら書き起こしたものですか?
それならば不具合が出たとしても何をググって調べればいいかわかると思います
プログラミング技法って昔持ってた記憶があるけど一度通読したあと埃かぶってたまま引っ越しの時に捨てたくらいいまいちな本だった記憶
自分はやっぱり最初は「はじめてのDelphi」が一番わかりやすかったし
「Delphiオブジェクト指向プログラミング」でVCL読むようになって
「インサイドDelphi」とか「シェルプログラミング入門」が楽しく読めるようになった
そうです私もおじさんです >>690
何をしたいのか分からないよ?
focusって言葉がそもそも違うんじゃない?
もし何らかの理由で本当にlistboxにfocusを与えたまま
維持したいんだけど、できないんだったら
他のコントロールがfocusを奪ってるんでしょ
それを調べたらいいんじゃない? >>697
自分なんか「おじさん」じゃなくて
60過ぎのジイサンだよ
と言ってもdelphi歴は短いけどね
今はfmxにハマってる ListBoxってフォーカスの有無で外観が変わったっけ?
フォーカスがなくなって困ることってある? ご評価していただいた皆様ありがとうございます。
このソフトを作るときは、巻き戻し・プログレスバー移動自由自在・リモコン対応
を目標に作り始めましたが、どれ一つも実現できませんでした。
MCIを使っての巻き戻しは、テープ系なら可能みたいですがMpegではデバイスが対応していないので無理。プログレスバーでの移動はどんなに大変なのかは、DelphiでDVDプレイヤーを作った方のサイトがあるのでそちらを参照してください。
大本のVolume制御以外は自分で実装しましたが、新しく別プロジェクトを作って試作してめどが立ってから導入しましたが、何故か思ったように動かず。
前半はMCIに翻弄され後半はインターフェースに苦しみ、メディアプレイヤーはもう少し修行を重ねてから、作りたいと思います。
愚痴めいた内容ですみません。
色々アドバイスをしてくれた皆様、特に質問を投げかけたときに、コマンドを一言つぶやいていただいた方、自分で使い方を調べることで理解が進みました。
スレ汚し失礼しました。 教えてくれた皆さんありがとう
つかれた
mp3再生君にはかないませんでした。
こんな感じで そうでした。
Object Pascal言語ガイドを少し腰を据えて読んで理解したいと思います。 前も言ったような気がするけど
fmxのコントロールのカスタムスタイルって
Windowsだと10でしか有効にならなくない?
設定した背景色とか8.1や7じゃ消えてるし >>707
Windowsのバージョンで別々に設定できる反面、Windows10専用で設定されてるのに気付かないと別の環境では変な表示になっちゃうよね MCI君をいじると擁護する単発が現れるのももう恒例行事になってきた。 >>708
そうなんだ
確かに「ターゲットプラットフォームの
バージョンごとにネイティブ」って書いてあるね
Windows 10 Desktop用に作ってあったとして
新たに8用と7用も作ってやらないとならないのか
こりゃちょっと大変な作業だ >>712
デフォルトスタイルに設定するか、スタイルを保存して各プラットホームにマージしたらそんなに手間でもないよ >>713
ありがとう
マージできるんだ
何もわからないで始めたのがマズかった DelphiXEを使ってます。
エクスプローラからプロジェクトファイルをダブルクリックしてDelphiが起動するのですが、
さらにもう一つ同じ操作で起動すると、先に起動したIDEのプロジェクトグループに追加され
てしまいます。2つ目のプロジェクトを別のIDE画面で起動したいのですが、そのような設定
があるのでしょうか? >>715
スタートメニューから起動してプロジェクトロードするしかない
レジストリをいじれば出来るかもしれないけど Rioの各デスクトップレイアウトを変更した後
それを保存する項目がメニューから消えたみたいですが? >>718
つ ttps://qiita.com/ht_deko/items/573f7c11c15c46f895c6
のQ.7かな? >>719
ありがとうございました
できました
このボタンが関係するのかなとも思いましたが
Hintも非表示でスルーしてました エンタープライズコネクターのインストール方法教えて下さい。
ダウンロードしてsetup.exeを実行してパスを通すの? ちょっと教えてください
fmxのカスタムスタイル変更でコントロールの背景を変更するとき
Windows 10 Desktopstyle.pngとかWindows 7style.pngとか利用しますが
これってどこにあるの?
この画像を修正したいいんですがドライブの中を検索しても見つかりません Delphi10.3 Community Edition 入れてみた
オブジェクトインスペクタのイベントTabが開かないんだけど
俺だけ?
Delphi10.23 Community Editionでは問題なく選択できる 'イベント'の文字の所をクリックすると いけた
TABの色と右側空白の色が同じだったので、空白をクリックしていただけだったw クリックしてイベントTabを開けない方が難しいと思うw 10.3でPostMessageを使ったメソッド、イベントハンドラ呼び出しの
標準のラッパーみたいのありますか
Call(Button1Click, [Sender]);
的な使い方ができるもの AndroidアプリのためにFMX.MEMOを使って
簡単なテキストエディタを作ろうと思ったが
いざAndroid上で動かすと、漢字入力の際
変換中の文字列の色が変化せずに困っている
普通は入力中の文字、文節の区切り、カーソル位置で
色が変わったり下線が表示されるが、周りの文字と同じままで
どこが入力中で、どこが文節の区切りなのか分からない
何か設定が足りないんだろうか?
(IMEはGoogle日本語入力です) D7 です。
それなりに以前の機器の古いバイナリデータの日時情報が 8 byte(64bit) Hex で記録されているのですが、
日付TDateTime型 に入れる式をどなたか分りませんでしょうか?
この形式のような気配なのですが
ttp://madia.world.coocan.jp/vb/vb_bbs2/200602/200602_06020084.html
>Windowsは、「1601年1月1日 00:00:00からの100ナノ秒単位の経過数」です。
実データ値
0x88D24B060812D480 : 2015/04/22 11:24:29 付近
0x88D24B0608AB6B00 : 次の変化 : 差分 int 10000000 = Hex 0x989680
↓
0x88D24B0628429380 : 2015/04/22 11:25:23 付近 : 最終
// UNIX 系の変換はこのような感じでやってたのですが
var
i64 : Int64;
la : Longword;
TextStr : String;
ULDateTime : TDateTime;
begin
i64 := StrToInt64('$' + Edit_Unix64bitDateTime.Text);
la := i64 div 1000;
ULDateTime := UnixToDateTime(la);
TextStr := FormatDateTime('YYYY/MM/DD HH:MM:SS',ULDateTime);
UNIX 系でのミリ秒含めでもなさそうでちょっとお手あげです。 64bitの符号付きかね?
符号無しでも試してみれば? 整数型は、符号付き・符号無しのどちらか?
リトルエンディアン・ビッグエンディアンのどちらか?
そのサイトのソースコードを見ると、
unsigned long low, high;
unsigned は、符号無し
val[0〜3]がlow、[4〜7]がhigh、
0123_4567 が、low_high だから、ミドル(PDP)エンディアンか?
1234_ABCD を、ABCD_1234 にしているのか?
Wikipedia の「エンディアン」を参照して! D7から10.3comに変更してAndroidアプリでも作ろうかと気軽にチャレンジしたら
すげー苦労してる・・・
プロパティ名が微妙に違うしStringGridとかListviewみたいになってるし
ダイアログとかも面倒くせー すまんエン馬鹿スレと間違えた メッセージが分かりづれーよJane 詳細書き直し
古い規格データの機器からのバイナリデータ。
目的:古いデータを今の形式にする為。
日時部分を Delphi D7 で扱える ULDateTime : TDateTime; に入れたい。
問題点:時間部分の変換が分らない。
データブロックを構成する他の部分データ部分はリトルエンディアンで構成されている。
バイナリエディタで見ると不明で残る日時データ部分が8バイトの羅列。
[0][1][2][3][4][5][6][7]
(1) "80 D4 12 08 06 4B D2 88"
データの変る区切りで (2)つ目の変化
(2) "00 6B AB 08 06 4B D2 88"
時間が進むごとに
[0] 側から加算されていく、よってこの部分もリトルエンディアンで構成。
1分に満たない時間変化で4バイト目も変っていく為 32bitではない。 Link先はUnix系だからこれでいけるようだけど違うみたいね
function bswap64(i: int64): int64;
begin
result := (i and $ff00000000000000) shr 56 or (i and $ff000000000000) shr 40 or
(i and $ff0000000000) shr 24 or (i and $ff00000000) shr 8 or
(i and $ff000000) shl 8 or (i and $ff0000) shl 24 or
(i and $ff00) shl 40 or (i and $ff) shl 56;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i64 : Int64;
d: double;
la: cardinal;
s : String;
dt : TDateTime;
begin
i64 := StrToInt64('$' + '6082D42A5A38C601');
i64 := bswap64(i64);
d := i64 * 1.0e-7;
d := d - 11644473600;
d := d /(24*60*60) + UnixDateDelta;
dt := FloatToDateTime(d);
// la := Trunc(d);
// dt := UnixToDateTime(la);
Edit2.Text := FormatDateTime('YYYY/MM/DD HH:MM:SS', dt);
end; パソコンで続きを書こうとしたらホスト規制の文字が出る
>736 考えてみます Q : 整数型は、符号付き・符号無しのどちらか?
A : いっさい不明
全差分 54秒 ほどの間に 1529 個ほどのデータ
時間文字の違いを抜き出し
time 1> 0x88D24B060812D480 : 2015/04/22 11:24:29 付近
time 2> 0x88D24B0608AB6B00
〜
time end-1> 0x88D24B0627A9FD00
time end> 0x88D24B0628429380 : 2015/04/22 11:25:23 付近
2進数、8進数、10進数、16進数相互変換ツール
h ttp:〜(この〜〜は規制がどうたらこーたら表示)
符号なし10進数化で差分を求めると 10000000
これが1秒の更新と一致。
新展開
"00 40 E4 47 02 22 C1 08" : 終了段未計測の値、(データ無し)
0x08C1220247E44000
符号なし で変換 630822816000000000 ググるといくつも何かがHit
Calendar のどうたらこーたら英文一杯 >>738
time2の値を0xffffffffffffffff-1(=0x7fffffffffffffff)でbit andを取ると、
0x8d24b0628429380
この値を.NET frameworkのDateTime型に渡してインスタンス化したところ、
2015/04/22 11:25:23
となり一致した。
.NET frameworkのDateTime型は、100nsecの分解能をもつグレゴリオ歴0001年1月1日 00:00:00からの経過時間
またほかの考察から、1sec=10000000であり、ちょうど100nsecの分解能とも一致している。 >>738
データ点数1529は、
1529 = 54 * 28 + 1
なので、28Hzのクロックシグナルでログを取っているものと予想される >>738
日時の表現が.NET frameworkのDateTime互換と仮定すると、
>>739 では上位1bitを捨てたけど、実際には2bit捨てるのが正しい。
この2bitが何物かといえば、
時刻の種類を示すbit flagで、指定なし(0), utc(1), local(2)
例示された値の上位2bitは0b10(=2)なので、ローカルタイムだったのだろうと推測される。 >>739-741
ありがとうございます。
まとめるとこのような感じで上手くいくようです。 .NET frameworkのDateTime互換型と仮定 → (.Net型 非対応) Delphi TDateTime型
対象 : 0x88D24B0628429380 : 2015/04/22 11:25:23 付近
符号なしで推移
2000年1月1日 00:00:00 基準値 0x08C1220247E44000
差分
16進数 = 80112903E05E5380
10進数 = 9228202208084775808
02進数 = 1000000000010001001010010000001111100000010111100101001110000000
.NET frameworkのDateTime型は、100nsecの分解能をもつグレゴリオ歴0001年1月1日 00:00:00からの経過時間
時刻の種類を示すbit flagで、指定なし(0), utc(1), local(2)
値の上位2bitは0b10(=2)なので、ローカルタイム
上位2bit捨てる
2000/01/01 00:00:00 以降だけと仮定(計測機器データなので過去は無し)
1000000000010001001010010000001111100000010111100101001110000000
00000000010001001010010000001111100000010111100101001110000000 = 4830171230000000 = 0x112903E05E5380
4830171230000000 / 10000 ms = 483017123000 {切捨て}
483017123000 (ms)
/1000 = 483017123 ...0 (ms)
/60 = 8050285 ...23 (sec)
/60 = 134171 ...25 (min)
/24 = 5590 ...11 (hour)
2000年1月1日 から 5590 日のローカルタイム経過日 .NET frameworkのDateTime互換型と仮定 → (.Net 非対応) Delphi TDateTime型
検証中
uses
// (略)
DateUtils,Math;
procedure TForm1.Button_Hex64Bit2000CalendarClick(Sender: TObject);
var
i64 : Int64;
// (略)
TextStr : String;
ULDateTime : TDateTime;
begin
i64 := StrToInt64('$' + Edit_Hex64BitDotNfDateTime.Text);
i64 := i64 - $08C1220247E44000;
TextStr := IntToHex(i64,16);
Memo1.Lines.Add(TextStr);
// Hex 16bit 文字→ 2bit String に変換
// 上位2bit 文字 で utc(1)00, local(2)10 を判定後削除
// i64 := 残りを 10進数数値に変換
// i64 := Trunc(i64/10000); // ミリ秒単位化
i64 := 483017123000; // (仮入れ)
ULDateTime := StrToDateTime('2000/01/01 00:00:00.000');
ULDateTime := IncMilliSecond(ULDateTime,i64);
TextStr := FormatDateTime('YYYY/MM/DD HH:MM:SS.ZZZ',ULDateTime);
Memo1.Lines.Add(TextStr);
end;
結果 : 2015/04/22 11:25:23.000
一致しました。 関数化したものを分けて書こうとすると
Sorry, you have been blocked
You are unable to access 5ch.net
>744 変更
i64 := i64 - $08C1220247E44000;
// Int64 → 2bit String に変換
TextStr := Int64ToBin(i64,False); // 他者さんの参照外部関数を改変
// 上位2bit 文字 で utc(1)00, local(2)10 を判定後削除
// 上位ゴミ'0'削除
// i64 := 残りを 10進数数値に変換 function DotNf64bitHexToDateTimeStr(Str8bytesHex : String; Flg,MS : Boolean) : String; // 8 Bytes Hex , Flg check , ms on(True/False)off
(省略 >744冒頭部分近似)
// i64 := 残りを 10進数数値に変換
ib := 0; // 頭"i"Int
ea := 0; // 頭"e"Extended
ilen := Length(TextStr);
for ia := ilen downto 1 do
begin
iBin := StrToIntDef(TextStr[ia],0);
ea := ea + ((power(2,ib)) * iBin);
ib := ib + 1;
end;
i64 := Trunc(ea / 10000); // ミリ秒単位化
ULDateTime := StrToDateTime(DateTimeStr);
ULDateTime := IncMilliSecond(ULDateTime,i64);
if MS then DateTimeStr := FormatDateTime('YYYY/MM/DD HH:MM:SS.ZZZ',ULDateTime);
if MS = False then DateTimeStr := FormatDateTime('YYYY/MM/DD HH:MM:SS',ULDateTime);
end;
if Flg then DateTimeStr := UL + DateTimeStr;
DotNf64bitHexToDateTimeStr := DateTimeStr;
end;
end. 補足
i64 := StrToInt64('$' + Str8bytesHex);
// Int64 → 2bit String に変換 'Int64ToBin' で検索先
// 上位2bit 文字 で utc(1)01, local(2)10 を判定
i64 := i64 - $08C1220247E44000;
// Int64 → 2bit String に変換
// 上位ゴミ'0'削除
// i64 := 残りを 10進数数値に変換
流れをこうしないと年日時の結果は同じでも
指定なし(0) 上位2bit 文字 '00' の場合
差し引き結果から'01'のutc判別となってしまう。 DocWikiの内容をzipファイルか何かで一括ダウンロードする方法あったら教えてください 古いD6をまだ使っているが、エディタは VScode にDelphi extension入れて
使っている
デバッグはD6のIDEでやるしかないけど、両方立ち上げておけば
まあ使えますね 俺もD6で、秀丸でコーディングしていたが、VSodeに切り替えてみようかな。
VSCodeは他の言語で使ってるので。 VScodeの注意点: 別PCのファイルを開くと、変更が反映されない事象あり
自動保存されるけど、書きなおしたやつをまた開くと直っているように見えるのに、
実際は直ってないとか。 意味不明 >>751 あっちとこっちで同時にファイル開いてたせいみたい 別に今必要な事じゃないんだけど
エクスプローラーのファイル名で並べたら
ファイル1
ファイル2
・・
ファイル10
って並ぶでしょ。 これどんなロジックなんだろ
スマートな方法が思いつかないし興味ある 自分は自作ソフトで似たようなことやってるけど
1文字単位での比較で数値同士の比較の場合に、その先の数値じゃなくなる前まで読んで整数にして比較ってしてる
小数点以下は1文字単位での比較として扱うので整数にしない
ただ 第11話 最終話 のような場合のロジックが面倒 VisualStudioでDelphi使えないかなぁ Delphi Community EditionとC++Builder Community Editionは同時にインストールできないんだな。 >>753
例えばこういうのは?
ファイル名文字列をバイト単位で数値化して加算
f0 = 0x65 + 0x30 = 101 + 48 = 149
f1 = 150
f2 = 151
f01 = 0x65 + 0x30 + 0x31 = 198
数値化した値で降順ソート
つまり
格納されてるファイル名を文字ではなく文字コードの数値合計でソート 補足
f01 = 0f1 = 1f0 になってしまうので
f(filename)文字列の桁数 len:=length(f) で文字列制限を設けて
for i:=1 to len do
if i<10 then a:=a+Ord(f[i])*10 else a:=a+Ord(f[i]);
適当処理 >>757
それだと
abcd5.txt
bbcd1.txt
というファイルがあった場合に
bbcd1.txt
abcd5.txt
という並び順になっちゃうんじゃね?
あくまで"文字列"+"数値" というファイル名に対して"文字列"で比較し、"文字列"が同一なら"数値"で比較する必要があると思うが
>>754の場合、数字が文字列の一部だった場合に正しくソートされないって問題があるけど
そういう場合のファイル名はあまり意味がないから気にしないようにしている
それと先頭が数字の場合は文字列の一部として扱ってる 自分の場合、壱弐参なんてのも数値として扱うようにしている(したい)からAPIだと望んだ結果を得られない
「数値もしくは数値に変換可能なもの」同士の比較の場合だけ整数として比較してる begin
var
i: Integer;
i := 0;
end;
コードフォーマッタ使うとこうなってしまうのだけどvarのあとで改行しない設定ってどこ? ttps://qiita.com/ht_deko/items/41e95154e8da2f901698
コメ欄w Sorry, my bad. My memory is confused. But, so what?
I mean, the fact is you humiliate Linus and Kernighan in such a way that they never know such a thing as you said.
たしかに恥ずかしい ちょっと教えてほしいんですが、社内イントラネット環境で50台くらいのクライアントPCと
1台のサーバーで双方向に情報をやり取りするVCLフォームアプリを作りたいですが
Delphiだと何使って構築するのが良いのでしょうか?
上からの命令でDelphi使うことなって調べてみたんですが、検索するとDataSnapとか
RESTとかのキーワードが出てきますが自分の経験がDelphi7でストップしていて
現状についていけてません。よろしくおねがいします。 >>767
情報のやり取りだけでは何とも言えんなー
それだけの要件だとIndyかWinsocksで通信したらええんちゃうってなる ふつーにIISで鯖立てて、httpでやりあえばよくね? CのDLLは普通にDelphiでも使える。
つまりcurlとかも普通に選択肢になると思う。 なんでDelphiが指定されたんだろう?
今まで使ってた訳じゃないのに ネィティブ系だと実質C++かDelphiかの選択肢しかなくね? >>767
Firebird + Apache + SOAP >>753
[Delphi]Windows XPの規則(自然順ソート・natural sort・natural ordering)ででファイル名をソートする
https://www.gesource.jp/weblog/?p=5947 >>774
DBはPostgreSQLかMariaDB UnZIP32.DLLとかUnRAR32.DLLでRARファイルの操作する場合の質問です
例えば
BOOL WINAPI UnrarCheckArchive(LPCSTR szFileName,const int iMode);
と定義されてるUnrarCheckArchive関数をDelphiで定義すると
UnrarCheckArchive: function(szFileName: LPCSTR; const iMode: integer): Boolean; stdcall;
こんな感じなって通常はこれで問題ないのですが、
Unicode文字(バ、ガなどの濁音とか)が混じってるファイル名の場合上手く行きません
szFileNameがLPCSTRだからAnsiString扱いなのでUnicodeのファイル名を渡せないのもの当然なのですが、
なにかプログラム側でできる回避策はないでしょうか? >>778
使用しているdelphiのバージョンを書いてください。
delphi2009前か後かで回答が変わるかもしれないからです。
UnrarChechArchive関数の仕様に基づいて型キャストしてやれば良さそうな気がします。
例えばnull終端wide stringという仕様なら、渡すファイル名をまずPWideCharにキャストして、さらにPAnsiCharにキャスト。 >>779
レスありがとうございます
使用してるDelphiは2010です
>UnrarChechArchive関数の仕様
szFileNameはLPCSTRなので32bit系のDLLではnull終端のAnsiChar配列(のポインタ)になってると思います
>渡すファイル名をまずPWideCharにキャストして、さらにPAnsiCharにキャスト。
var
Path : string;
UnrarCheckArchive(PAnsiChar(PWideChar(Path)), 0);
この型キャストでは残念ながら上手く行かないようです LongFileNameをShortFileNameに変換すると
幸せになれる >>781
ナイスアドバイスです
GetShortPathNameで上手く行きました
おかげさまで幸せになれました
ありがとうございました TDateTime datetime = VarToDateTime("令和元年5月10日9時10分15秒");
今はエラーが出るんだがそのうち対応されるのか? ■ このスレッドは過去ログ倉庫に格納されています