Form.WindowStateを見る。
1 2 3 4 |
if (WindowState == FormWindowState.Maximized) { MessageBox.Show("Miximized"); } |
Form.WindowStateを見る。
1 2 3 4 |
if (WindowState == FormWindowState.Maximized) { MessageBox.Show("Miximized"); } |
VS2008でフォームプロジェクトをつくり、フォームにボタンを設置しハンドラを以下のように書くとエラーになる。
1 2 3 4 5 |
private void button1_Click(object sender, EventArgs e) { Location.X = 100; Location.Y = 100; } |
1 |
エラー 1 変数ではないため、'System.Windows.Forms.Form.Location' の戻り値を変更できません。 C:\T\hhh\nonvariable\nonvariable\Form1.cs 21 13 nonvariable |
再現するために簡単なコンソールプログラムを作る。
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 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; namespace nonvariable2 { class AA { internal System.Drawing.Point pt{get;set;} }; class Program { static void Main(string[] args) { AA aa = new AA(); // エラー 1 変数ではないため、'nonvariable2.AA.pt' の戻り値を変更できません。 // aa.pt.X = 100; Point pp = aa.pt; pp.X = 100; Console.WriteLine(aa.pt.X); } } } |
Form.LocationはSystem.Drawing.Pointでこれはstructであり、value typeだ。
value typeということはボックス化が問題のように感じるがおそらくこれはそうではない。
value typeとはC言語で言うところのstructであって=で値を設定すれば全フィールドコピーされ、関数で渡しても関数から返してもコピーされるような型のことだ。
上記コードのプロパティpt.getはあくまで関数であり返すのはコピーである。ボックス化されたものではない。よってこのコピーの値を変更することは意味を成さない。プロパティにしなければエラーにはならない。
最初のコードは以下のように書くのが正解
1 2 3 4 |
private void button1_Click(object sender, EventArgs e) { Location = new Point(100, 100); } |
Form.Locationはウインドウの位置だからX,Yを別々に設定するのはよくない。しかしエラーの表示は「変数でないため」というのも変な感じだ。これはFormの設計がおかしいのだろうか。
Form.Locationはsetされたときウインドウの位置を変えないとならないのでプロパティでやるしかない。Pointをいじれないとするとしょうがないのか
ちなみにC++/CLIだとエラーにならないが、あたいは設定されないので最初なやむ。
タスクバーには表示されていることが前提。
1、まずタスクバーで問題のウインドウをクリックしてアクティブにする。
2、[Alt]+[Space]を押す。(Altを押しながらSpaceを押す)
3、[M]を押す。
4、この状態でカーソルキー(矢印キー)でウインドウを動かせるようになっているのでいろいろ動かして画面上に持ってくる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <string> #include <sstream> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { const char* p = "aaa\nbbb\r\nccc\n\nddd\n"; std::stringstream is(p); string t; while(getline(is, t)) { t.erase(t.find_last_not_of("\r")+1); cout << t << endl; } return 0; } |
debianではfirefoxはリポジトリにはなく、オリジナルビルドのiceweaselを使っているがこれだとプロファイルマネージャが動かなかったので本家からfirefoxをダウンロードして生インストールする。
最初にiceweaselを削除
# apt-get remove iceweasel
本家からlinux版firefoxをダウンロードする。ここではfirefox-26.0.tar.bz2をダウンロードした。
$ tar xf firefox-26.0.tar.bz2
これはソースではなく実効ファイルがそのまま入ってたからビルドする必要なかった。
/opt/fireにコピーしてシンボリックリンクをはった
# cd /usr/bin
# ln -s /opt/firefox/firefox firefox
設定ファイルを全消去してプロファイルマネージャを起動
$ cd
$ rm -rfv .mozilla/
$ firefox -ProfileManager
flashはadobe本家からlibflashplayer.soをダウンロードして .mozilla/plugins/の中に入れるかシンボリックリンクをはる。
どれかでみる。カーネルのバージョンとディストリのバージョンがある。
1 2 3 4 5 |
$ cat /proc/version $ uname -a $ lsb_release -a $ cat /etc/lsb-release $ cat /etc/debian_version |
/proc/versionはカーネルから直接持ってくる。ここの文字列はカーネルをビルドしたときに埋め込まれるものだと思う。
unameは/proc/versionを見ていると思う。
lsb_releaseはpythonで/usr/lib/python2.7/dist-packages/lsb_release.pyに書かれている。その他のはただのファイルでこれらはディトリビュータが書いたものと思われる。
/etc/apt/sources.listを編集してcdromになってるところを消す。
1 |
deb cdrom:[Debian GNU/Linux 7.3.0 _Wheezy_ - Official i386 kde-CD Binary-1 20131215-03:39]/ wheezy main |
↓最初に#をつけてコメントアウト
1 |
# deb cdrom:[Debian GNU/Linux 7.3.0 _Wheezy_ - Official i386 kde-CD Binary-1 20131215-03:39]/ wheezy main |
アイコン長クリックで移動できる。
文字コードの話は正確にやろうとすると大変なので適当に書いてみる。
JIS X 0208
Unicode
ISO-2022-JP
EUC-JP
Shift_JIS
文字集合の集合、EUC-JPではASCII+JIS X 0208+その他
US-ASCII:0から127まで使う標準的な半角英数文字と制御コード
128から255までをどう使うかでいくつかの文字コードがある
ISO-8859-1はドイツ語のウムラウトとかアルファベットの上に何らかのマークがつく文字を収録していてヨーロッパでは基本の文字コード、WindowsではWindows-1252ともいわれる。
ISO-8859-5はキリル語(ロシア語)の文字だがあんまり使われずKOI8-Rが使われるらしい。
欧米件は文字数が少ないので1バイトでよかったが、漢字圏では足りないので2バイト以上になる。
Shitf-JIS:最大2バイト
もともと日本語はJIS X 0201でASCIIでつかってなかった領域にカタカナを収めて1バイトで使っていた。
漢字が表示できるようになってからは、この1バイトの使ってない領域を2バイト文字へ移行する制御コードとして使い、2バイトを利用して漢字を表現していた。
Cプログラムなどで問題になるのは2バイト文字の2バイト目が\などになった場合である。例えばパスを¥で区切るプログラムを単純に作っているとこの2バイト目の¥に引っかかっておかしくなってしまう。
EUC-JPやUTF8では2バイト目以降のバイトにこれらのASCIIは入らないのでこのような問題は起こらない。
ソフト業界が国際化してからはWindowsではUTF16を使いLinuxではUTF8を使うことが多い。UTF16は基本的に2バイト固定なので文字操作はしやすいが欧州圏からみるとメモリがもったいない。
Unicodeでは¥とバックスラッシュは区別されているが、JIS X 0201のASCII部分も実は若干変わっていてバックスラッシュのところに¥を割り当てている。文字コード変換などでShift-JISからUnicodeに変換したときもし¥がそのままUnicodeの¥になってしまうと困るので運用上はASCII部分は変換しない慣習になっている。逆にUNICODEの\(U+00A5)からShift-JISに変換した場合はバックスラッシュに変換してしまう。よってさらにこれをUNICODEに変換したら元の文字列と同じにならないことになる。日本語環境では今後もバックスラッシュにお目にかかることはないのだろう。
UTF8で書いていて本当にバックスラッシュを表示したい場合はHTMLなら
1 |
<span lang="en" xml:lang="en">\</span> |
と書けばいいようだ。実際書いてみる→\
Windowsでは文字コードをコードページという言い方をしているようだ。
1 2 3 4 5 6 7 8 |
int MultiByteToWideChar( UINT CodePage, // コードページ DWORD dwFlags, // 文字の種類を指定するフラグ LPCSTR lpMultiByteStr, // マップ元文字列のアドレス int cchMultiByte, // マップ元文字列のバイト数 LPWSTR lpWideCharStr, // マップ先ワイド文字列を入れるバッファのアドレス int cchWideChar // バッファのサイズ ); |
MultiByteというのは日本語環境ならShift-JISというように、Unicode以前の2バイト以上文字列のことでWindows98とかのころのOSのデフォルトの文字コードのことだろう。
WideChar、ワイド文字とはUTF16をさす。
第一引数のCodePageは入力文字列のコードページだがCP_ACPを指定すればOSのデフォルト設定が使われ日本語WindowsならShift-JIS(codepage932)になると思われる。もっとも昨今のWindowsはこのデフォルトのコードページを変えられると思われそれは、言語設定の非UNICODEアプリの設定になると思われる。
Cライブラリにはmbstowcsがあり、これで変換できる、LC_CTYPEがマルチバイト文字列をあらわしている。
最近のコンパイラはUNICODEで保存されていてもOKなのでリテラル文字列を国際化できる。一般にはコードはASCIIのみがよいとされているものと思われるが。
VC2008ではファイルの保存で文字コードを選択できるので以下のようなコードが書ける。
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 |
#include #include int _tmain() { MessageBox(NULL, L"Afrikaans" L"አማርኛ" L"Aragonés" L"العربية" L"Aymar aru" L"Башҡортса" L"Boarisch" L"Беларуская" L"Беларуская (тарашкевіца)" L"Български" L"বাংলা" L"Brezhoneg" L"Bosanski" L"Català" L"Cebuano" L"کوردی" L"Čeština" L"Чӑвашла" L"Dansk" L"Deutsch" L"Ελληνικά" L"English" L"Esperanto" L"Español" L"Eesti" L"Euskara" L"فارسی" L"Suomi" L"Français" L"Galego" L"Gaelg" L"עברית" L"हिन्दी" L"Hrvatski" L"Հայերեն" L"Bahasa Indonesia" L"Ilokano" L"Íslenska" L"Italiano" L"Basa Jawa" L"Қазақша" L"ಕನ್ನಡ" L"한국어" L"Къарачай-малкъар" L"Latina" L"Lëtzebuergesch" L"Lietuvių" L"Latgaļu" L"Latviešu" L"Македонски" L"മലയാളം" L"मराठी" L"Bahasa Melayu" L"مازِرونی" L"नेपाली" L"Nederlands" L"Norsk nynorsk" L"Norsk bokmål" L"Nouormand" L"Diné bizaad" L"Occitan" L"ਪੰਜਾਬੀ" L"Picard" L"Polski" L"پنجابی" L"Português" L"Runa Simi" L"Română" L"Русский" L"संस्कृतम्" L"Srpskohrvatski / српскохрватски" L"සිංහල" L"Simple English" L"Slovenčina" L"Slovenščina" L"Shqip" L"Српски / srpski" L"Svenska" L"தமிழ்" L"Тоҷикӣ" L"ไทย" L"Türkçe" L"Українська" L"اردو" L"Oʻzbekcha" L"Tiếng Việt" L"Winaray" L"ייִדיש" L"中文" L"文言" L"Bân-lâm-gú" L"粵語", L"INTERNATIONAL", MB_ICONINFORMATION); return 0; } |
wprintf()などで上のプログラムの文字列を表示しようとしてもほとんど表示できない。CRTは内部でマルチバイトにしてしまうためだとおもわれる。
以下のように強引に書いてもマルチバイトとして表示してしまう。
1 2 3 4 5 |
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), p, wcslen(p)*2, &d, NULL); |
もともとコンソールはワイド文字仕様になっていないものと思われる。
gccで上のプログラムを普通にコンパイルしても–input-charset=utf8 –exec-charset=utf8などのオプションをつけても以下のようにちゃんと表示されなかった。catなどではちゃんとutf8ファイルを表示出きるのでできると思うがいまはスルー。
1 2 3 |
$ ./a.out Afrikaans????Aragon?s???????Aymar aru?????????Boarisch???????????????????? (???????????)???????????????BrezhonegBosanskiCatal?Cebuano??????e?tina???????DanskDeutsch????????EnglishEsperantoEspa?olEestiEuskara?????SuomiFran?aisGalegoGaelg???????????Hrvatski???????Bahasa IndonesiaIlokano?slenskaItalianoBasa Jawa???????????????????????-???????LatinaL?tzebuergeschLietuvi?Latga?uLatvie?u?????????????????????Bahasa Melayu??????????????NederlandsNorsk nynorskNorsk bokm?lNouormandDin? bizaadOccitan??????PicardPolski??????Portugu?sRuna SimiRom?n?????????????????Srpskohrvatski / ???????????????????Simple EnglishSloven?inaSloven??inaShqip?????? / srpskiSvenska??????????????T?rk?e??????????????O?zbekchaTi?ng Vi?tWinaray??????????B?n-l?m-g??? $ |
Windows Update関連らしてくほっとけば直るらしいがわずらわしい場合はProcess Explorerで優先度を落とせばいい。
8が通常なので6に落とす。なぜかタスクマネージャだと落とせない。